<?php
namespace Modules\GestorY\Services;

use Gestoreasy\Core\Tenant\ConnectionManager;
use Gestoreasy\Core\Tenant\TenantContext;
use PDO;

class ProdutoIntegrationService {
    private PDO $pdo;
    private string $tenantId;

    public function __construct() {
        $this->pdo = ConnectionManager::forTenant();
        $this->tenantId = TenantContext::getTenantId();
    }

    /**
     * Importa peça Yamaha como produto no ERP
     */
    public function importarComoProduto(int $pecaId, ?array $dadosCustom = null): ?int {
        try {
            // Buscar peça
            $stmt = $this->pdo->prepare('SELECT * FROM gestory_pecas WHERE id = ? AND tenant_id = ? LIMIT 1');
            $stmt->execute([$pecaId, $this->tenantId]);
            $peca = $stmt->fetch();
            
            if (!$peca) {
                throw new \Exception('Peça não encontrada');
            }

            // Verificar se já foi importada
            if (!empty($peca['product_id'])) {
                $productId = (int)$peca['product_id'];
                // Atualizar produto existente
                $this->atualizarProduto($productId, $peca, $dadosCustom);
                return $productId;
            }

            // Criar novo produto
            $codigo = $dadosCustom['codigo'] ?? 'YAM-' . $peca['codigo_yamaha'];
            $nome = $dadosCustom['nome'] ?? $peca['nome'];
            $preco = $dadosCustom['preco'] ?? $peca['preco_yamaha'] ?? 0;
            $descricao = $dadosCustom['descricao'] ?? $peca['descricao'] ?? "Peça Yamaha: {$peca['nome']}";
            
            // Verificar se código já existe
            $stmt = $this->pdo->prepare('SELECT id FROM products WHERE codigo = ? LIMIT 1');
            $stmt->execute([$codigo]);
            $existing = $stmt->fetch();
            
            if ($existing) {
                $productId = (int)$existing['id'];
                $this->atualizarProduto($productId, $peca, $dadosCustom);
            } else {
                // Inserir novo produto
                $stmt = $this->pdo->prepare('INSERT INTO products 
                    (codigo, nome, descricao, preco, estoque, categoria, imagem_url, observacoes)
                    VALUES (?, ?, ?, ?, ?, ?, ?, ?)');
                
                $observacoes = "Código Yamaha: {$peca['codigo_yamaha']}";
                if ($peca['modelo_compativel']) {
                    $modelos = json_decode($peca['modelo_compativel'], true);
                    if (is_array($modelos)) {
                        $observacoes .= "\nModelos compatíveis: " . implode(', ', $modelos);
                    }
                }
                
                $stmt->execute([
                    $codigo,
                    $nome,
                    $descricao,
                    $preco,
                    $dadosCustom['estoque'] ?? 0,
                    $dadosCustom['categoria'] ?? 'Peças Yamaha',
                    $peca['imagem_url'] ?? null,
                    $observacoes
                ]);
                
                $productId = (int)$this->pdo->lastInsertId();
            }

            // Atualizar referência na peça
            $stmt = $this->pdo->prepare('UPDATE gestory_pecas 
                SET product_id = ?, data_importacao = NOW() 
                WHERE id = ? AND tenant_id = ?');
            $stmt->execute([$productId, $pecaId, $this->tenantId]);

            return $productId;
        } catch (\Exception $e) {
            error_log("[GestorY] Erro ao importar produto: " . $e->getMessage());
            throw $e;
        }
    }

    /**
     * Atualiza produto existente
     */
    private function atualizarProduto(int $productId, array $peca, ?array $dadosCustom): void {
        $updates = [];
        $params = [];
        
        if (isset($dadosCustom['nome'])) {
            $updates[] = 'nome = ?';
            $params[] = $dadosCustom['nome'];
        }
        
        if (isset($dadosCustom['preco'])) {
            $updates[] = 'preco = ?';
            $params[] = $dadosCustom['preco'];
        }
        
        if (isset($dadosCustom['descricao'])) {
            $updates[] = 'descricao = ?';
            $params[] = $dadosCustom['descricao'];
        }
        
        if (!empty($peca['imagem_url']) && !isset($dadosCustom['imagem_url'])) {
            $updates[] = 'imagem_url = ?';
            $params[] = $peca['imagem_url'];
        }
        
        if (!empty($updates)) {
            $params[] = $productId;
            $stmt = $this->pdo->prepare('UPDATE products SET ' . implode(', ', $updates) . ' WHERE id = ?');
            $stmt->execute($params);
        }
    }

    /**
     * Importa múltiplas peças
     */
    public function importarLote(array $pecaIds, ?array $opcoes = null): array {
        $resultados = [
            'sucesso' => 0,
            'erros' => 0,
            'produtos' => []
        ];
        
        foreach ($pecaIds as $pecaId) {
            try {
                $productId = $this->importarComoProduto($pecaId, $opcoes);
                $resultados['sucesso']++;
                $resultados['produtos'][] = [
                    'peca_id' => $pecaId,
                    'product_id' => $productId
                ];
            } catch (\Exception $e) {
                $resultados['erros']++;
                error_log("[GestorY] Erro ao importar peça $pecaId: " . $e->getMessage());
            }
        }
        
        return $resultados;
    }
}

