<?php
ini_set('display_errors', 0);
error_reporting(E_ALL);

require_once(dirname(__DIR__) . '/config/db.php');
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);

require_once __DIR__ . '/home_service.php';

// Define para evitar que realizado_actions execute seu switch ao ser incluído
define('HOME_ACTIONS_LOADING', true);
require_once __DIR__ . '/realizado_actions.php';

header('Content-Type: application/json; charset=utf-8');

function jsonOut($data) {
    echo json_encode($data, JSON_UNESCAPED_UNICODE);
    exit;
}

// Pré-aquecimento de cache do home (fire-and-forget)
function prewarmHomeCache(): void {
    $host = $_SERVER['HTTP_HOST'] ?? 'localhost';
    $isHttps = !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off';
    $port = (int)($_SERVER['SERVER_PORT'] ?? ($isHttps ? 443 : 80));
    $scheme = $isHttps ? 'ssl://' : '';
    $scriptName = $_SERVER['SCRIPT_NAME'] ?? '/index.php';
    $baseDir = dirname($scriptName);
    $path = rtrim($baseDir, '/') . '/index.php?m=home&warm=1';

    $sid = session_id();
    $fp = @fsockopen($scheme . $host, $port, $errno, $errstr, 0.5);
    if ($fp) {
        $out = "GET {$path} HTTP/1.1\r\n";
        $out .= "Host: {$host}\r\n";
        if (!empty($sid)) {
            $out .= "Cookie: PHPSESSID={$sid}\r\n";
        }
        $out .= "Connection: Close\r\n\r\n";
        @fwrite($fp, $out);
        @fclose($fp);
    }
}

$acao = $_GET['ajax'] ?? 'dashboard';

if ($acao === 'dashboard') {
    $dados = obterDadosDashboard($pdo);
    jsonOut($dados);
}

if ($acao === 'sincronizar_periodo_automatico') {
    sincronizarPeriodoAutomatico();
}

jsonOut(['ok' => false, 'msg' => 'Ação inválida em home_actions.']);

/**
 * Sincroniza período automático do dashboard
 * - Período base: mês corrente (dia 1 até último dia)
 * - Se nos 2 primeiros dias do mês: também sincroniza mês anterior
 */
function sincronizarPeriodoAutomatico() {
    global $pdo;

    // Garantir que retorna JSON em qualquer circunstância
    ob_start();
    
    try {
        $cdempresa = (int)($_SESSION['cdempresa'] ?? 0);
        if (!$cdempresa) {
            ob_end_clean();
            jsonOut(['ok' => false, 'msg' => 'Empresa não informada na sessão'], 400);
        }

        // Calcular período automaticamente
        // Regra base: sempre reimportar TODO o mês corrente
        // Nos 2 primeiros dias do mês subsequente, também reimportar
        // TODO o mês anterior (para capturar ajustes tardios).
        $hoje = new DateTimeImmutable('today');
        $dia  = (int)$hoje->format('d');

        $primeiroMesAtual = $hoje->modify('first day of this month')->format('Y-m-d');
        $ultimoMesAtual   = $hoje->modify('last day of this month')->format('Y-m-d');

        if ($dia <= 2) {
            // Até o 2º dia do mês, incluir também o mês anterior inteiro
            $primeiroMesAnterior = $hoje->modify('first day of last month')->format('Y-m-d');
            $dtinicio = $primeiroMesAnterior;
            $dtfim    = $ultimoMesAtual;
        } else {
            // Demais dias: apenas o mês corrente completo
            $dtinicio = $primeiroMesAtual;
            $dtfim    = $ultimoMesAtual;
        }

        // Buscar todas as integrações ativas
        $stmtInt = $pdo->prepare("
            SELECT DISTINCT i.cdintegracao
              FROM back.integracao i
             WHERE i.flativo = true
             ORDER BY i.cdintegracao
        ");
        
        if (!$stmtInt) {
            ob_end_clean();
            jsonOut(['ok' => false, 'msg' => 'Erro na preparação do statement'], 500);
        }
        
        $stmtInt->execute();
        $integracoes = $stmtInt->fetchAll(PDO::FETCH_COLUMN);

        if (empty($integracoes)) {
            ob_end_clean();
            jsonOut(['ok' => false, 'msg' => 'Nenhuma integração ativa configurada']);
        }

        $totalIns = 0;
        $totalIgnorados = 0;
        $totalErros = 0;
        $totalIgnoradosMotivos = [
            'empresa_origem_sem_mapeamento' => 0,
            'empresa_nao_vinculada_integracao' => 0,
            'dtmovimento_vazio' => 0,
            'dtmovimento_invalido' => 0,
            'exercicio_nao_criado' => 0,
        ];
        $detalhes = [];

        // Para cada integração, chamar sincronizarIntegracaoAgora com datas calculadas
        // IMPORTANTE: restringe à empresa logada ($cdempresa) para desempenho
        foreach ($integracoes as $cdintegracao) {
            try {
                // Executa a sincronização dessa integração com as datas calculadas
                // apenas para a empresa logada
                $resultado = sincronizarIntegracaoAgora($cdintegracao, $dtinicio, $dtfim, $cdempresa, 'manual');
                
                $totalIns += $resultado['total'] ?? 0;
                $totalIgnorados += $resultado['ignorados'] ?? 0;
                $totalErros += $resultado['erros'] ?? 0;

                if (!empty($resultado['ignorados_motivos']) && is_array($resultado['ignorados_motivos'])) {
                    foreach ($resultado['ignorados_motivos'] as $motivo => $qtd) {
                        if (!isset($totalIgnoradosMotivos[$motivo])) {
                            $totalIgnoradosMotivos[$motivo] = 0;
                        }
                        $totalIgnoradosMotivos[$motivo] += (int)$qtd;
                    }
                }
                
                $detalhes[] = "Integração {$cdintegracao}: {$resultado['total']} inseridos, {$resultado['ignorados']} ignorados, {$resultado['erros']} erros";
            } catch (Exception $ex) {
                $totalErros++;
                $detalhes[] = "Integração {$cdintegracao}: ERRO - " . $ex->getMessage();
            }
        }

        $msg = "Sincronização de {$dtinicio} até {$dtfim}: {$totalIns} registros inseridos";
        if ($totalIgnorados > 0) $msg .= ", {$totalIgnorados} ignorados";
        if ($totalErros > 0) $msg .= ", {$totalErros} com erro";

        session_write_close();
        prewarmHomeCache();

        ob_end_clean();
        jsonOut([
            'ok' => true,
            'msg' => $msg,
            'total' => $totalIns,
            'ignorados' => $totalIgnorados,
            'erros' => $totalErros,
            'ignorados_motivos' => $totalIgnoradosMotivos,
            'detalhes' => $detalhes
        ]);

    } catch (Exception $e) {
        ob_end_clean();
        jsonOut(['ok' => false, 'msg' => 'Erro na sincronização: ' . $e->getMessage()], 500);
    } catch (Throwable $t) {
        ob_end_clean();
        jsonOut(['ok' => false, 'msg' => 'Erro fatal: ' . $t->getMessage()], 500);
    }
}
