<?php
namespace Modules\GestorContratos\Services;

use PDO;

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

    public function __construct(string $tenantId) {
        $this->tenantId = $tenantId;
        $this->pdo = \Gestoreasy\Core\Tenant\ConnectionManager::forTenant($tenantId);
    }

    /**
     * Busca dados de cliente para preenchimento automático
     */
    public function buscarDadosCliente(int $clienteId): array {
        $stmt = $this->pdo->prepare('
            SELECT 
                id, nome, email, telefone, cpf_cnpj,
                endereco, cidade, estado, cep
            FROM clients
            WHERE id = ? AND tenant_id = ?
        ');
        $stmt->execute([$clienteId, $this->tenantId]);
        $cliente = $stmt->fetch(PDO::FETCH_ASSOC);

        if (!$cliente) {
            return [];
        }

        // Buscar endereço principal
        $stmt = $this->pdo->prepare('
            SELECT * FROM client_addresses
            WHERE client_id = ? AND principal = 1
            LIMIT 1
        ');
        $stmt->execute([$clienteId]);
        $endereco = $stmt->fetch(PDO::FETCH_ASSOC);

        return [
            'NOME_CLIENTE' => $cliente['nome'],
            'EMAIL_CLIENTE' => $cliente['email'],
            'TELEFONE_CLIENTE' => $cliente['telefone'],
            'CPF_CNPJ_CLIENTE' => $cliente['cpf_cnpj'],
            'ENDERECO_CLIENTE' => $endereco ? ($endereco['logradouro'] . ', ' . $endereco['numero'] . ' - ' . $endereco['bairro']) : '',
            'CIDADE_CLIENTE' => $endereco['cidade'] ?? '',
            'ESTADO_CLIENTE' => $endereco['estado'] ?? '',
            'CEP_CLIENTE' => $endereco['cep'] ?? ''
        ];
    }

    /**
     * Busca dados de fornecedor para preenchimento automático
     */
    public function buscarDadosFornecedor(int $fornecedorId): array {
        $stmt = $this->pdo->prepare('
            SELECT 
                id, nome, email, telefone, cnpj,
                endereco, cidade, estado, cep
            FROM suppliers
            WHERE id = ? AND tenant_id = ?
        ');
        $stmt->execute([$fornecedorId, $this->tenantId]);
        $fornecedor = $stmt->fetch(PDO::FETCH_ASSOC);

        if (!$fornecedor) {
            return [];
        }

        return [
            'NOME_FORNECEDOR' => $fornecedor['nome'],
            'EMAIL_FORNECEDOR' => $fornecedor['email'],
            'TELEFONE_FORNECEDOR' => $fornecedor['telefone'],
            'CNPJ_FORNECEDOR' => $fornecedor['cnpj'],
            'ENDERECO_FORNECEDOR' => $fornecedor['endereco'] ?? '',
            'CIDADE_FORNECEDOR' => $fornecedor['cidade'] ?? '',
            'ESTADO_FORNECEDOR' => $fornecedor['estado'] ?? '',
            'CEP_FORNECEDOR' => $fornecedor['cep'] ?? ''
        ];
    }

    /**
     * Busca dados de venda para preenchimento automático
     */
    public function buscarDadosVenda(int $vendaId): array {
        $stmt = $this->pdo->prepare('
            SELECT 
                so.id, so.numero, so.data_pedido, so.valor_total,
                so.status, so.observacoes,
                c.nome as cliente_nome, c.email as cliente_email, c.cpf_cnpj as cliente_cpf_cnpj
            FROM sales_orders so
            LEFT JOIN clients c ON so.cliente_id = c.id
            WHERE so.id = ? AND so.tenant_id = ?
        ');
        $stmt->execute([$vendaId, $this->tenantId]);
        $venda = $stmt->fetch(PDO::FETCH_ASSOC);

        if (!$venda) {
            return [];
        }

        // Buscar itens da venda
        $stmt = $this->pdo->prepare('
            SELECT 
                p.nome, soi.quantidade, soi.valor_unitario, soi.valor_total
            FROM sales_order_items soi
            LEFT JOIN products p ON soi.product_id = p.id
            WHERE soi.sales_order_id = ?
        ');
        $stmt->execute([$vendaId]);
        $itens = $stmt->fetchAll(PDO::FETCH_ASSOC);

        $itensTexto = '';
        foreach ($itens as $item) {
            $itensTexto .= $item['nome'] . ' - Qtd: ' . $item['quantidade'] . ' - Valor: R$ ' . number_format($item['valor_total'], 2, ',', '.') . "\n";
        }

        return [
            'NUMERO_PEDIDO' => $venda['numero'],
            'DATA_PEDIDO' => date('d/m/Y', strtotime($venda['data_pedido'])),
            'VALOR_TOTAL' => 'R$ ' . number_format($venda['valor_total'], 2, ',', '.'),
            'ITENS_PEDIDO' => $itensTexto,
            'CLIENTE_NOME' => $venda['cliente_nome'],
            'CLIENTE_EMAIL' => $venda['cliente_email'],
            'CLIENTE_CPF_CNPJ' => $venda['cliente_cpf_cnpj']
        ];
    }

    /**
     * Busca dados da empresa para preenchimento automático
     */
    public function buscarDadosEmpresa(): array {
        $stmt = $this->pdo->prepare('
            SELECT 
                nome, cnpj, email, telefone,
                endereco, cidade, estado, cep
            FROM empresas
            WHERE tenant_id = ? AND ativa = 1
            LIMIT 1
        ');
        $stmt->execute([$this->tenantId]);
        $empresa = $stmt->fetch(PDO::FETCH_ASSOC);

        if (!$empresa) {
            return [];
        }

        return [
            'NOME_EMPRESA' => $empresa['nome'],
            'CNPJ_EMPRESA' => $empresa['cnpj'],
            'EMAIL_EMPRESA' => $empresa['email'],
            'TELEFONE_EMPRESA' => $empresa['telefone'],
            'ENDERECO_EMPRESA' => $empresa['endereco'] ?? '',
            'CIDADE_EMPRESA' => $empresa['cidade'] ?? '',
            'ESTADO_EMPRESA' => $empresa['estado'] ?? '',
            'CEP_EMPRESA' => $empresa['cep'] ?? '',
            'DATA_ATUAL' => date('d/m/Y'),
            'DATA_ATUAL_EXTENSO' => $this->dataPorExtenso()
        ];
    }

    /**
     * Combina todos os dados disponíveis
     */
    public function buscarTodosDados(?int $clienteId = null, ?int $fornecedorId = null, ?int $vendaId = null): array {
        $dados = $this->buscarDadosEmpresa();

        if ($clienteId) {
            $dados = array_merge($dados, $this->buscarDadosCliente($clienteId));
        }

        if ($fornecedorId) {
            $dados = array_merge($dados, $this->buscarDadosFornecedor($fornecedorId));
        }

        if ($vendaId) {
            $dados = array_merge($dados, $this->buscarDadosVenda($vendaId));
        }

        return $dados;
    }

    /**
     * Retorna data por extenso
     */
    private function dataPorExtenso(): string {
        $meses = [
            1 => 'janeiro', 2 => 'fevereiro', 3 => 'março', 4 => 'abril',
            5 => 'maio', 6 => 'junho', 7 => 'julho', 8 => 'agosto',
            9 => 'setembro', 10 => 'outubro', 11 => 'novembro', 12 => 'dezembro'
        ];

        $dia = date('d');
        $mes = (int)date('m');
        $ano = date('Y');

        return $dia . ' de ' . $meses[$mes] . ' de ' . $ano;
    }
}

