<?php
namespace Modules\GestorContratos\Services;

use PDO;
use Exception;

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

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

    /**
     * Envia contrato para assinatura
     */
    public function enviarParaAssinatura(int $contratoId): bool {
        try {
            $this->pdo->beginTransaction();

            // Buscar contrato e signatários
            $stmt = $this->pdo->prepare('
                SELECT * FROM contratos
                WHERE id = ? AND tenant_id = ?
            ');
            $stmt->execute([$contratoId, $this->tenantId]);
            $contrato = $stmt->fetch(PDO::FETCH_ASSOC);

            if (!$contrato) {
                throw new Exception('Contrato não encontrado');
            }

            // Buscar signatários
            $stmt = $this->pdo->prepare('
                SELECT * FROM contratos_signatarios
                WHERE contrato_id = ?
                ORDER BY ordem ASC
            ');
            $stmt->execute([$contratoId]);
            $signatarios = $stmt->fetchAll(PDO::FETCH_ASSOC);

            if (empty($signatarios)) {
                throw new Exception('Nenhum signatário definido');
            }

            // Atualizar status do contrato
            $stmt = $this->pdo->prepare('
                UPDATE contratos
                SET status = "pendente_assinatura"
                WHERE id = ?
            ');
            $stmt->execute([$contratoId]);

            // Enviar e-mail para cada signatário
            foreach ($signatarios as $signatario) {
                $this->enviarEmailAssinatura($contrato, $signatario);
            }

            // Registrar no histórico
            $stmt = $this->pdo->prepare('
                INSERT INTO contratos_historico (
                    contrato_id, acao, descricao, user_id, user_nome, user_email,
                    dados_depois_json, ip_address, user_agent
                ) VALUES (
                    :contrato_id, :acao, :descricao, :user_id, :user_nome, :user_email,
                    :dados_depois_json, :ip_address, :user_agent
                )
            ');

            $userContext = \Gestoreasy\Core\Auth\UserContext::getCurrent();

            $stmt->execute([
                ':contrato_id' => $contratoId,
                ':acao' => 'enviado',
                ':descricao' => 'Contrato enviado para assinatura',
                ':user_id' => $userContext?->userId,
                ':user_nome' => $userContext?->name,
                ':user_email' => $userContext?->email,
                ':dados_depois_json' => json_encode(['signatarios' => count($signatarios)]),
                ':ip_address' => $_SERVER['REMOTE_ADDR'] ?? null,
                ':user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? null
            ]);

            $this->pdo->commit();
            return true;
        } catch (Exception $e) {
            $this->pdo->rollBack();
            throw new Exception('Erro ao enviar contrato para assinatura: ' . $e->getMessage());
        }
    }

    /**
     * Envia e-mail de assinatura
     */
    private function enviarEmailAssinatura(array $contrato, array $signatario): void {
        $assinuaturaService = new AssinaturaService($this->tenantId);
        $linkAssinatura = $assinuaturaService->gerarLinkAssinatura($signatario['id']);

        $assunto = 'Contrato para Assinatura: ' . $contrato['titulo'];
        $corpo = $this->gerarCorpoEmailAssinatura($contrato, $signatario, $linkAssinatura);

        // Enviar e-mail
        $this->enviarEmail($signatario['email'], $assunto, $corpo, $contrato['id'], $signatario['id'], 'envio');

        // Atualizar status do signatário
        $stmt = $this->pdo->prepare('
            UPDATE contratos_signatarios
            SET email_enviado = TRUE,
                email_enviado_em = NOW()
            WHERE id = ?
        ');
        $stmt->execute([$signatario['id']]);
    }

    /**
     * Gera corpo do e-mail de assinatura
     */
    private function gerarCorpoEmailAssinatura(array $contrato, array $signatario, string $linkAssinatura): string {
        $html = '
        <!DOCTYPE html>
        <html>
        <head>
            <meta charset="UTF-8">
            <style>
                body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
                .container { max-width: 600px; margin: 0 auto; padding: 20px; }
                .header { background: #ff6a00; color: white; padding: 20px; text-align: center; }
                .content { padding: 20px; background: #f9f9f9; }
                .button { display: inline-block; padding: 12px 24px; background: #ff6a00; color: white; text-decoration: none; border-radius: 4px; margin: 20px 0; }
                .footer { padding: 20px; text-align: center; font-size: 12px; color: #666; }
            </style>
        </head>
        <body>
            <div class="container">
                <div class="header">
                    <h1>Contrato para Assinatura</h1>
                </div>
                <div class="content">
                    <p>Olá ' . htmlspecialchars($signatario['nome']) . ',</p>
                    <p>Você recebeu um contrato para assinatura:</p>
                    <h2>' . htmlspecialchars($contrato['titulo']) . '</h2>
                    <p><strong>Número:</strong> ' . htmlspecialchars($contrato['numero']) . '</p>
                    ' . (!empty($contrato['data_expiracao']) ? '<p><strong>Válido até:</strong> ' . date('d/m/Y H:i', strtotime($contrato['data_expiracao'])) . '</p>' : '') . '
                    <p>Clique no botão abaixo para acessar e assinar o contrato:</p>
                    <a href="' . $linkAssinatura . '" class="button">Assinar Contrato</a>
                    <p>Ou copie e cole o link abaixo no seu navegador:</p>
                    <p style="word-break: break-all; color: #666;">' . $linkAssinatura . '</p>
                    <p>Atenciosamente,<br>Equipe GestorEasy</p>
                </div>
                <div class="footer">
                    <p>Este é um e-mail automático, por favor não responda.</p>
                </div>
            </div>
        </body>
        </html>';

        return $html;
    }

    /**
     * Notifica que contrato foi assinado
     */
    public function notificarContratoAssinado(int $contratoId): void {
        $stmt = $this->pdo->prepare('
            SELECT * FROM contratos
            WHERE id = ? AND tenant_id = ?
        ');
        $stmt->execute([$contratoId, $this->tenantId]);
        $contrato = $stmt->fetch(PDO::FETCH_ASSOC);

        if (!$contrato) {
            return;
        }

        // Buscar todos os signatários
        $stmt = $this->pdo->prepare('
            SELECT * FROM contratos_signatarios
            WHERE contrato_id = ?
        ');
        $stmt->execute([$contratoId]);
        $signatarios = $stmt->fetchAll(PDO::FETCH_ASSOC);

        // Enviar e-mail para cada signatário
        foreach ($signatarios as $signatario) {
            $assunto = 'Contrato Assinado: ' . $contrato['titulo'];
            $corpo = $this->gerarCorpoEmailAssinado($contrato, $signatario);

            $this->enviarEmail($signatario['email'], $assunto, $corpo, $contratoId, $signatario['id'], 'assinado');
        }
    }

    /**
     * Gera corpo do e-mail de contrato assinado
     */
    private function gerarCorpoEmailAssinado(array $contrato, array $signatario): string {
        $html = '
        <!DOCTYPE html>
        <html>
        <head>
            <meta charset="UTF-8">
            <style>
                body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
                .container { max-width: 600px; margin: 0 auto; padding: 20px; }
                .header { background: #556b2f; color: white; padding: 20px; text-align: center; }
                .content { padding: 20px; background: #f9f9f9; }
                .footer { padding: 20px; text-align: center; font-size: 12px; color: #666; }
            </style>
        </head>
        <body>
            <div class="container">
                <div class="header">
                    <h1>Contrato Assinado</h1>
                </div>
                <div class="content">
                    <p>Olá ' . htmlspecialchars($signatario['nome']) . ',</p>
                    <p>O contrato abaixo foi assinado por todos os signatários:</p>
                    <h2>' . htmlspecialchars($contrato['titulo']) . '</h2>
                    <p><strong>Número:</strong> ' . htmlspecialchars($contrato['numero']) . '</p>
                    <p><strong>Data de assinatura:</strong> ' . date('d/m/Y H:i', strtotime($contrato['data_assinatura'])) . '</p>
                    <p>O contrato está agora arquivado e disponível para consulta.</p>
                    <p>Atenciosamente,<br>Equipe GestorEasy</p>
                </div>
                <div class="footer">
                    <p>Este é um e-mail automático, por favor não responda.</p>
                </div>
            </div>
        </body>
        </html>';

        return $html;
    }

    /**
     * Envia e-mail
     */
    private function enviarEmail(string $email, string $assunto, string $corpo, int $contratoId, ?int $signatarioId, string $tipo): void {
        try {
            // Registrar notificação
            $stmt = $this->pdo->prepare('
                INSERT INTO contratos_notificacoes (
                    contrato_id, signatario_id, tipo,
                    destinatario_email, assunto, corpo_html, status
                ) VALUES (
                    :contrato_id, :signatario_id, :tipo,
                    :destinatario_email, :assunto, :corpo_html, :status
                )
            ');

            $stmt->execute([
                ':contrato_id' => $contratoId,
                ':signatario_id' => $signatarioId,
                ':tipo' => $tipo,
                ':destinatario_email' => $email,
                ':assunto' => $assunto,
                ':corpo_html' => $corpo,
                ':status' => 'pendente'
            ]);

            // Enviar e-mail (usar Mailer do sistema)
            $mailer = new \Gestoreasy\Core\Mail\Mailer();
            $mailer->send($email, $assunto, $corpo);

            // Atualizar status
            $notificacaoId = $this->pdo->lastInsertId();
            $stmt = $this->pdo->prepare('
                UPDATE contratos_notificacoes
                SET status = "enviado",
                    enviado_em = NOW()
                WHERE id = ?
            ');
            $stmt->execute([$notificacaoId]);

        } catch (Exception $e) {
            // Registrar erro
            if (isset($notificacaoId)) {
                $stmt = $this->pdo->prepare('
                    UPDATE contratos_notificacoes
                    SET status = "falha",
                        erro = ?
                    WHERE id = ?
                ');
                $stmt->execute([$e->getMessage(), $notificacaoId]);
            }
        }
    }

    /**
     * Envia lembretes para signatários pendentes
     */
    public function enviarLembretes(): void {
        // Buscar signatários pendentes que precisam de lembrete
        $stmt = $this->pdo->prepare('
            SELECT cs.*, c.titulo, c.numero, c.data_expiracao, c.tenant_id
            FROM contratos_signatarios cs
            INNER JOIN contratos c ON cs.contrato_id = c.id
            WHERE cs.status = "pendente"
            AND c.status = "pendente_assinatura"
            AND c.tenant_id = ?
            AND (cs.ultimo_lembrete IS NULL OR cs.ultimo_lembrete < DATE_SUB(NOW(), INTERVAL 3 DAY))
            AND cs.lembretes_enviados < 3
        ');
        $stmt->execute([$this->tenantId]);
        $signatarios = $stmt->fetchAll(PDO::FETCH_ASSOC);

        foreach ($signatarios as $signatario) {
            $assinuaturaService = new AssinaturaService($this->tenantId);
            $linkAssinatura = $assinuaturaService->gerarLinkAssinatura($signatario['id']);

            $assunto = 'Lembrete: Contrato Pendente de Assinatura - ' . $signatario['titulo'];
            $corpo = $this->gerarCorpoEmailLembrete($signatario, $linkAssinatura);

            $this->enviarEmail($signatario['email'], $assunto, $corpo, $signatario['contrato_id'], $signatario['id'], 'lembrete');

            // Atualizar contador de lembretes
            $stmt = $this->pdo->prepare('
                UPDATE contratos_signatarios
                SET lembretes_enviados = lembretes_enviados + 1,
                    ultimo_lembrete = NOW()
                WHERE id = ?
            ');
            $stmt->execute([$signatario['id']]);
        }
    }

    /**
     * Gera corpo do e-mail de lembrete
     */
    private function gerarCorpoEmailLembrete(array $signatario, string $linkAssinatura): string {
        $html = '
        <!DOCTYPE html>
        <html>
        <head>
            <meta charset="UTF-8">
            <style>
                body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
                .container { max-width: 600px; margin: 0 auto; padding: 20px; }
                .header { background: #ff6a00; color: white; padding: 20px; text-align: center; }
                .content { padding: 20px; background: #f9f9f9; }
                .button { display: inline-block; padding: 12px 24px; background: #ff6a00; color: white; text-decoration: none; border-radius: 4px; margin: 20px 0; }
                .footer { padding: 20px; text-align: center; font-size: 12px; color: #666; }
            </style>
        </head>
        <body>
            <div class="container">
                <div class="header">
                    <h1>Lembrete: Contrato Pendente</h1>
                </div>
                <div class="content">
                    <p>Olá ' . htmlspecialchars($signatario['nome']) . ',</p>
                    <p>Este é um lembrete de que você ainda precisa assinar o contrato:</p>
                    <h2>' . htmlspecialchars($signatario['titulo']) . '</h2>
                    <p><strong>Número:</strong> ' . htmlspecialchars($signatario['numero']) . '</p>
                    ' . (!empty($signatario['data_expiracao']) ? '<p><strong>Válido até:</strong> ' . date('d/m/Y H:i', strtotime($signatario['data_expiracao'])) . '</p>' : '') . '
                    <p>Por favor, clique no botão abaixo para assinar:</p>
                    <a href="' . $linkAssinatura . '" class="button">Assinar Agora</a>
                    <p>Atenciosamente,<br>Equipe GestorEasy</p>
                </div>
                <div class="footer">
                    <p>Este é um e-mail automático, por favor não responda.</p>
                </div>
            </div>
        </body>
        </html>';

        return $html;
    }
}

