<?php
require_once __DIR__ . '/../core/db_helper.php';
require_once __DIR__ . '/../core/auth.php';
require_once __DIR__ . '/../core/notificacoes.php';

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

$escopo = escopo_visibilidade($usuarioLogado);
$clientes = db_read('clientes');
if ($escopo !== null) {
    $clientes = array_values(array_filter($clientes, fn($c) => in_array($c['criado_por'] ?? '', $escopo, true)));
}

$hoje = new DateTime('today');
$totais = ['total' => 0, 'ativos' => 0, 'inativos' => 0, 'testes_expirados' => 0];

foreach ($clientes as $c) {
    $totais['total']++;
    if (($c['status'] ?? '') === 'Inativo') {
        $totais['inativos']++;
    } else {
        $totais['ativos']++;
    }
    if (($c['tipo'] ?? '') === 'teste') {
        $venc = new DateTime($c['vencimento'] ?? 'now');
        if ($venc < new DateTime('now')) {
            $totais['testes_expirados']++;
        }
    }
}

// Financeiro (filtrado pelo escopo de clientes visíveis)
$financeiro = db_read('financeiro');
$idsClientesVisiveis = array_column($clientes, 'id');
if ($escopo !== null) {
    $financeiro = array_values(array_filter($financeiro, fn($f) => in_array($f['cliente_id'] ?? '', $idsClientesVisiveis, true)));
}

$faturamento = ['dia' => 0, 'semana' => 0, 'mes' => 0, 'ano' => 0];
foreach ($financeiro as $f) {
    if (($f['tipo'] ?? '') !== 'entrada') continue;
    $data = new DateTime($f['data'] ?? 'now');
    $valor = (float) ($f['valor'] ?? 0);
    if ($data->format('Y-m-d') === $hoje->format('Y-m-d')) $faturamento['dia'] += $valor;
    if ($data->format('W-Y') === $hoje->format('W-Y')) $faturamento['semana'] += $valor;
    if ($data->format('m-Y') === $hoje->format('m-Y')) $faturamento['mes'] += $valor;
    if ($data->format('Y') === $hoje->format('Y')) $faturamento['ano'] += $valor;
}

// Projeção de entrada: soma do valor efetivo (já com desconto, se ativo)
// dos clientes ATIVOS que VENCEM em cada período — é uma estimativa do que
// ainda deve entrar, baseada nos vencimentos, diferente do faturamento
// (que é o dinheiro que JÁ entrou de verdade, registrado no Financeiro).
$projecao = ['dia' => 0, 'semana' => 0, 'mes' => 0, 'ano' => 0];
foreach ($clientes as $c) {
    if (($c['status'] ?? '') !== 'Ativo' || ($c['tipo'] ?? 'cliente') === 'teste' || empty($c['vencimento'])) {
        continue;
    }
    $venc = new DateTime($c['vencimento']);
    $valorEsperado = valor_efetivo_cliente($c);
    if ($venc->format('Y-m-d') === $hoje->format('Y-m-d')) $projecao['dia'] += $valorEsperado;
    if ($venc->format('W-Y') === $hoje->format('W-Y')) $projecao['semana'] += $valorEsperado;
    if ($venc->format('m-Y') === $hoje->format('m-Y')) $projecao['mes'] += $valorEsperado;
    if ($venc->format('Y') === $hoje->format('Y')) $projecao['ano'] += $valorEsperado;
}

// Alertas de estoque de servidores abaixo de 10% de vagas livres
// (baseado em clientes ATIVOS de verdade, não só no contador de teste grátis)
$servidores = db_read('servidores');
$todosClientes = db_read('clientes');
$ocupacaoPorServidor = [];
foreach ($todosClientes as $c) {
    if (($c['status'] ?? '') === 'Ativo' && ($c['tipo'] ?? 'cliente') !== 'teste') {
        $nomeServidor = $c['servidor'] ?? '';
        $ocupacaoPorServidor[$nomeServidor] = ($ocupacaoPorServidor[$nomeServidor] ?? 0) + 1;
    }
}
$alertasEstoque = [];
foreach ($servidores as $s) {
    $max = (int) ($s['estoque_maximo'] ?? 0);
    if ($max <= 0) continue;
    $ocupado = $ocupacaoPorServidor[$s['nome']] ?? 0;
    $livre = max(0, $max - $ocupado);
    if (($livre / $max) < 0.10) {
        $alertasEstoque[] = ['servidor' => $s['nome'], 'atual' => $livre, 'maximo' => $max, 'ocupado' => $ocupado];
    }
}

// Alertas de vencimento de painel de revendedores em 3 dias
$usuarios = db_read('usuarios');
$alertasRevenda = [];
foreach ($usuarios as $u) {
    if (in_array($u['nivel'], ['REVENDA', 'SUBREVENDA'], true) && !empty($u['vencimento_painel'])) {
        $venc = new DateTime($u['vencimento_painel']);
        $diff = (int) $hoje->diff($venc)->format('%r%a');
        if ($diff === 3) {
            $alertasRevenda[] = ['usuario' => $u['usuario'], 'vencimento' => $u['vencimento_painel']];
        }
    }
}

// Alertas de vencimento de clientes: faltando 3 dias, vencendo hoje, ou
// já atrasados (mas ainda não inativados pelo cron — normalmente até 2 dias)
$alertasClientes = [];
foreach ($clientes as $c) {
    if (($c['status'] ?? '') === 'Inativo' || empty($c['vencimento'])) {
        continue;
    }
    if (($c['tipo'] ?? 'cliente') === 'teste') {
        continue; // testes grátis não entram nos alertas de vencimento de cliente pagante
    }
    $venc = new DateTime($c['vencimento']);
    $venc->setTime(0, 0, 0);
    $diff = (int) $hoje->diff($venc)->format('%r%a');

    $vencimentoFormatado = (new DateTime($c['vencimento']))->format('d/m/Y H:i');
    if ($diff > 0 && $diff <= 3) {
        $alertasClientes[] = ['cliente' => $c['nome'], 'id' => $c['id'], 'whatsapp' => $c['whatsapp'] ?? '', 'situacao' => 'vence_em_dias', 'dias_para_vencer' => $diff, 'vencimento' => $vencimentoFormatado];
    } elseif ($diff === 0) {
        $alertasClientes[] = ['cliente' => $c['nome'], 'id' => $c['id'], 'whatsapp' => $c['whatsapp'] ?? '', 'situacao' => 'vence_hoje', 'vencimento' => $vencimentoFormatado];
    } elseif ($diff < 0 && $diff >= -2) {
        $alertasClientes[] = ['cliente' => $c['nome'], 'id' => $c['id'], 'whatsapp' => $c['whatsapp'] ?? '', 'situacao' => 'atrasado', 'dias_atraso' => abs($diff), 'vencimento' => $vencimentoFormatado];
    }
}
// Ordena: atrasados primeiro, depois vence hoje, depois os que faltam mais dias por último
usort($alertasClientes, function ($a, $b) {
    $peso = ['atrasado' => 0, 'vence_hoje' => 1, 'vence_em_dias' => 2];
    $pa = $peso[$a['situacao']] ?? 9;
    $pb = $peso[$b['situacao']] ?? 9;
    if ($pa !== $pb) return $pa <=> $pb;
    // dentro do mesmo grupo, ordena pelo mais urgente primeiro
    $da = $a['dias_atraso'] ?? $a['dias_para_vencer'] ?? 0;
    $db = $b['dias_atraso'] ?? $b['dias_para_vencer'] ?? 0;
    return ($a['situacao'] === 'atrasado' ? -$da : $da) <=> ($b['situacao'] === 'atrasado' ? -$db : $db);
});

echo json_encode([
    'ok' => true,
    'totais' => $totais,
    'faturamento' => $faturamento,
    'projecao' => $projecao,
    'alertas_estoque' => $alertasEstoque,
    'alertas_revenda' => $alertasRevenda,
    'alertas_clientes' => $alertasClientes,
], JSON_UNESCAPED_UNICODE);
