<?php

require_once __DIR__ . '/../../config/bootstrap.php';

use ControleFrotas\Config\Database;
use ControleFrotas\Utils\Response;
use ControleFrotas\Utils\Logger;

header('Content-Type: application/json');

// Verificar autenticação e permissão de administrador
$user = requireRole('Administrador', 'Supervisor');

if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    obterDadosDashboard();
} else {
    Response::error('Método não permitido', 405);
}

function obterDadosDashboard(): void {
    try {
        // Buscar estatísticas usando a view criada no banco
        $stats = Database::queryOne("SELECT * FROM v_dashboard_stats");
        
        if (!$stats) {
            // Fallback para consultas individuais se a view não existir
            $stats = [
                'viagens_andamento' => Database::queryOne("SELECT COUNT(*) as count FROM viagens WHERE data_fim IS NULL")['count'],
                'viagens_hoje' => Database::queryOne("SELECT COUNT(*) as count FROM viagens WHERE DATE(data_inicio) = CURDATE()")['count'],
                'viagens_semana' => Database::queryOne("SELECT COUNT(*) as count FROM viagens WHERE WEEK(data_inicio) = WEEK(CURDATE())")['count'],
                'viagens_mes' => Database::queryOne("SELECT COUNT(*) as count FROM viagens WHERE MONTH(data_inicio) = MONTH(CURDATE())")['count'],
                'veiculos_disponiveis' => Database::queryOne("SELECT COUNT(*) as count FROM veiculos WHERE status = 'ativo'")['count'],
                'veiculos_em_uso' => Database::queryOne("SELECT COUNT(*) as count FROM veiculos WHERE status = 'em_uso'")['count'],
                'usuarios_ativos' => Database::queryOne("SELECT COUNT(*) as count FROM usuarios WHERE ativo = 1")['count']
            ];
        }

        // Estatísticas adicionais
        $estatisticasExtras = obterEstatisticasExtras();
        
        // Viagens por período (últimos 7 dias)
        $viagensPorDia = obterViagensPorDia();
        
        // Top técnicos do mês
        $topTecnicos = obterTopTecnicos();
        
        // Quilometragem total do mês
        $kmMes = Database::queryOne(
            "SELECT SUM(km_final - km_inicial) as total_km 
             FROM viagens 
             WHERE MONTH(data_inicio) = MONTH(CURDATE()) 
             AND YEAR(data_inicio) = YEAR(CURDATE())
             AND km_final IS NOT NULL"
        )['total_km'] ?? 0;

        Logger::info('Dashboard acessado', ['user_id' => getCurrentUser()['user_id']]);

        Response::success([
            'estatisticas' => $stats,
            'estatisticas_extras' => $estatisticasExtras,
            'viagens_por_dia' => $viagensPorDia,
            'top_tecnicos' => $topTecnicos,
            'km_total_mes' => (int)$kmMes,
            'ultima_atualizacao' => date('Y-m-d H:i:s')
        ]);

    } catch (Exception $e) {
        Logger::error('Erro ao obter dados do dashboard', [
            'error' => $e->getMessage(),
            'trace' => $e->getTraceAsString()
        ]);
        Response::error('Erro ao carregar dados do dashboard', 500);
    }
}

function obterEstatisticasExtras(): array {
    try {
        return [
            // Tempo médio de viagem (em minutos)
            'tempo_medio_viagem' => Database::queryOne(
                "SELECT AVG(TIMESTAMPDIFF(MINUTE, data_inicio, data_fim)) as media 
                 FROM viagens 
                 WHERE data_fim IS NOT NULL 
                 AND MONTH(data_inicio) = MONTH(CURDATE())"
            )['media'] ?? 0,

            // Distância média por viagem
            'distancia_media' => Database::queryOne(
                "SELECT AVG(km_final - km_inicial) as media 
                 FROM viagens 
                 WHERE km_final IS NOT NULL 
                 AND MONTH(data_inicio) = MONTH(CURDATE())"
            )['media'] ?? 0,

            // Viagens finalizadas hoje
            'viagens_finalizadas_hoje' => Database::queryOne(
                "SELECT COUNT(*) as count 
                 FROM viagens 
                 WHERE DATE(data_fim) = CURDATE()"
            )['count'],

            // Veículos em manutenção
            'veiculos_manutencao' => Database::queryOne(
                "SELECT COUNT(*) as count 
                 FROM veiculos 
                 WHERE status = 'manutencao'"
            )['count']
        ];
    } catch (Exception $e) {
        Logger::warning('Erro ao obter estatísticas extras', ['error' => $e->getMessage()]);
        return [];
    }
}

function obterViagensPorDia(): array {
    try {
        $dados = Database::queryAll(
            "SELECT 
                DATE(data_inicio) as data,
                COUNT(*) as total_viagens,
                COUNT(CASE WHEN data_fim IS NOT NULL THEN 1 END) as finalizadas
             FROM viagens 
             WHERE data_inicio >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
             GROUP BY DATE(data_inicio)
             ORDER BY data"
        );

        $resultado = [];
        foreach ($dados as $dado) {
            $resultado[] = [
                'data' => $dado['data'],
                'total' => (int)$dado['total_viagens'],
                'finalizadas' => (int)$dado['finalizadas'],
                'em_andamento' => (int)$dado['total_viagens'] - (int)$dado['finalizadas']
            ];
        }

        return $resultado;
    } catch (Exception $e) {
        Logger::warning('Erro ao obter viagens por dia', ['error' => $e->getMessage()]);
        return [];
    }
}

function obterTopTecnicos(): array {
    try {
        return Database::queryAll(
            "SELECT 
                u.nome,
                u.id,
                COUNT(v.id) as total_viagens,
                COUNT(CASE WHEN v.data_fim IS NOT NULL THEN 1 END) as viagens_finalizadas,
                SUM(CASE WHEN v.km_final IS NOT NULL THEN v.km_final - v.km_inicial ELSE 0 END) as km_total
             FROM usuarios u
             LEFT JOIN viagens v ON u.id = v.tecnico_id 
                AND MONTH(v.data_inicio) = MONTH(CURDATE())
                AND YEAR(v.data_inicio) = YEAR(CURDATE())
             WHERE u.cargo = 'Técnico' AND u.ativo = 1
             GROUP BY u.id, u.nome
             HAVING total_viagens > 0
             ORDER BY total_viagens DESC, viagens_finalizadas DESC
             LIMIT 5"
        );
    } catch (Exception $e) {
        Logger::warning('Erro ao obter top técnicos', ['error' => $e->getMessage()]);
        return [];
    }
} 
