<?php

namespace App\Repositories;

use App\Core\Cache;

class PessoalRepository
{
    public function __construct(private \PDO $pdo) {}

    public function kpis(): array
    {
        return Cache::lembrar('pessoal_kpis', 300, function () {
            $sql = "SELECT
                COUNT(*) TOTAL_GARCONS,
                COUNT(CASE WHEN g.ATIVO = 'S' THEN 1 END) ATIVOS
            FROM GARCOM g";
            return $this->pdo->query($sql)->fetch(\PDO::FETCH_ASSOC) ?: [];
        });
    }

    public function funcionarios(): array
    {
        return Cache::lembrar('pessoal_funcionarios', 600, function () {
            $sql = "SELECT
                g.COD_GARCOM,
                p.NOME,
                p.CPF,
                p.FONE_PRINC,
                p.CEL_PRINC,
                p.DATA_CADASTRO,
                g.ATIVO,
                g.TURNO,
                g.COM_GERAL,
                g.COM_VISTA,
                g.COM_CARTAO
            FROM GARCOM g
            JOIN PESSOAS p ON g.COD_PESSOA = p.COD_PESSOA
            ORDER BY p.NOME";
            return $this->pdo->query($sql)->fetchAll(\PDO::FETCH_ASSOC);
        });
    }

    public function performance(string $dataIni, string $dataFim): array
    {
        $key = "pessoal_perf_{$dataIni}_{$dataFim}";
        $ttl = $dataFim >= date('Y-m-d') ? 120 : 1800;
        return Cache::lembrar($key, $ttl, function () use ($dataIni, $dataFim) {
            $sql = "SELECT
                COALESCE(p.NOME, 'Sem registro') GARCOM,
                COUNT(DISTINCT am.COD_ABERTURA) QTD_MESAS,
                SUM(CASE WHEN am.STATUS='F' THEN am.TOTAL_ITENS ELSE 0 END) FATURAMENTO,
                AVG(CASE WHEN am.STATUS='F' THEN am.TOTAL_ITENS END) TICKET_MEDIO,
                SUM(CASE WHEN am.STATUS='F' THEN COALESCE(am.QTD_PESSOAS,0) ELSE 0 END) QTD_PESSOAS,
                COUNT(CASE WHEN am.STATUS='C' THEN 1 END) CANCELAMENTOS,
                SUM(CASE WHEN am.STATUS='F' THEN am.TX_SERVICO ELSE 0 END) TX_SERVICO
            FROM ABERT_MESA am
            LEFT JOIN GARCOM g ON am.COD_GARCOM = g.COD_GARCOM
            LEFT JOIN PESSOAS p ON g.COD_PESSOA = p.COD_PESSOA
            WHERE am.DATA_ABERTURA BETWEEN ? AND ?
            GROUP BY p.NOME
            ORDER BY FATURAMENTO DESC";
            $st = $this->pdo->prepare($sql);
            $st->execute([$dataIni, $dataFim]);
            return $st->fetchAll(\PDO::FETCH_ASSOC);
        });
    }

    public function comissoes(string $dataIni, string $dataFim): array
    {
        $key = "pessoal_com_{$dataIni}_{$dataFim}";
        $ttl = $dataFim >= date('Y-m-d') ? 120 : 1800;
        return Cache::lembrar($key, $ttl, function () use ($dataIni, $dataFim) {
            $sql = "SELECT
                COALESCE(p.NOME, 'Sem registro') GARCOM,
                g.COM_GERAL,
                g.COM_VISTA,
                g.COM_CARTAO,
                SUM(CASE WHEN am.STATUS='F' THEN am.TOTAL_ITENS ELSE 0 END) FATURAMENTO,
                SUM(CASE WHEN am.STATUS='F' THEN am.TOTAL_ITENS ELSE 0 END) * (g.COM_GERAL / 100.0) COMISSAO_CALC,
                SUM(CASE WHEN am.STATUS='F' THEN am.TX_SERVICO ELSE 0 END) TX_SERVICO
            FROM ABERT_MESA am
            JOIN GARCOM g ON am.COD_GARCOM = g.COD_GARCOM
            JOIN PESSOAS p ON g.COD_PESSOA = p.COD_PESSOA
            WHERE am.DATA_ABERTURA BETWEEN ? AND ?
              AND am.STATUS = 'F'
            GROUP BY p.NOME, g.COM_GERAL, g.COM_VISTA, g.COM_CARTAO
            ORDER BY FATURAMENTO DESC";
            $st = $this->pdo->prepare($sql);
            $st->execute([$dataIni, $dataFim]);
            return $st->fetchAll(\PDO::FETCH_ASSOC);
        });
    }

    public function evoluçãoMensal(int $ano): array
    {
        $key = "pessoal_evolucao_{$ano}";
        $ttl = $ano == (int)date('Y') ? 1800 : 86400;
        return Cache::lembrar($key, $ttl, function () use ($ano) {
            $ini = "{$ano}-01-01"; $fim = "{$ano}-12-31";
            $sql = "SELECT
                EXTRACT(MONTH FROM am.DATA_ABERTURA) MES,
                COUNT(DISTINCT am.COD_GARCOM) GARCONS_ATIVOS,
                COUNT(CASE WHEN am.STATUS='F' THEN 1 END) MESAS_FECHADAS,
                SUM(CASE WHEN am.STATUS='F' THEN am.TOTAL_ITENS ELSE 0 END) FATURAMENTO
            FROM ABERT_MESA am
            WHERE am.DATA_ABERTURA BETWEEN ? AND ?
            GROUP BY EXTRACT(MONTH FROM am.DATA_ABERTURA)
            ORDER BY MES";
            $st = $this->pdo->prepare($sql);
            $st->execute([$ini, $fim]);
            return $st->fetchAll(\PDO::FETCH_ASSOC);
        });
    }

    public function ultimaData(): string
    {
        $r = $this->pdo->query("SELECT MAX(DATA_ABERTURA) D FROM ABERT_MESA")->fetchColumn();
        if (!$r) return date('Y-m-d');
        if ($r instanceof \DateTime) return $r->format('Y-m-d');
        return substr((string)$r, 0, 10);
    }
}
