<?php
namespace Modules\Locadora\Controllers;

use Gestoreasy\Core\Http\Request;
use Gestoreasy\Core\Http\Response;
use Gestoreasy\Core\Tenant\ConnectionManager;
use Gestoreasy\Core\View\View;
use PDO;
use Exception;

class LocadoraController {
    private PDO $pdo;
    
    public function __construct() {
        $this->pdo = ConnectionManager::forTenant();
    }
    
    // ==== Views ====
    public function viewIndex(Request $r): Response {
        return View::renderWithLayout('locadora/index', ['title' => 'Locadora de Veículos']);
    }
    
    // ==== API - Relatórios ====
    public function relatorioDisponibilidade(Request $r): Response {
        try {
            $data = $r->query['data'] ?? date('Y-m-d');
            
            // Veículos disponíveis
            $disponiveisStmt = $this->pdo->prepare("
                SELECT COUNT(*) as total
                FROM locadora_frota
                WHERE status = 'disponivel'
            ");
            $disponiveisStmt->execute();
            $disponiveis = (int)$disponiveisStmt->fetchColumn();
            
            // Veículos locados
            $locadosStmt = $this->pdo->prepare("
                SELECT COUNT(*) as total
                FROM locadora_frota
                WHERE status = 'locado'
            ");
            $locadosStmt->execute();
            $locados = (int)$locadosStmt->fetchColumn();
            
            // Veículos em manutenção
            $manutencaoStmt = $this->pdo->prepare("
                SELECT COUNT(*) as total
                FROM locadora_frota
                WHERE status = 'manutencao'
            ");
            $manutencaoStmt->execute();
            $manutencao = (int)$manutencaoStmt->fetchColumn();
            
            // Contratos ativos
            $contratosStmt = $this->pdo->prepare("
                SELECT COUNT(*) as total
                FROM locadora_contratos
                WHERE status IN ('aberto', 'em_andamento')
                AND data_inicio <= ? AND data_fim >= ?
            ");
            $contratosStmt->execute([$data, $data]);
            $contratosAtivos = (int)$contratosStmt->fetchColumn();
            
            return Response::json([
                'data' => [
                    'data' => $data,
                    'disponiveis' => $disponiveis,
                    'locados' => $locados,
                    'manutencao' => $manutencao,
                    'contratos_ativos' => $contratosAtivos,
                    'total_frota' => $disponiveis + $locados + $manutencao
                ]
            ]);
        } catch (Exception $e) {
            return Response::json(['error' => $e->getMessage()], 500);
        }
    }
    
    public function relatorioFaturamento(Request $r): Response {
        try {
            $dataInicio = $r->query['data_inicio'] ?? date('Y-m-01');
            $dataFim = $r->query['data_fim'] ?? date('Y-m-t');
            
            // Faturamento por período
            $faturamentoStmt = $this->pdo->prepare("
                SELECT 
                    SUM(valor_total) as valor_total,
                    SUM(valor_adicional) as valor_adicional,
                    SUM(valor_final) as valor_final,
                    COUNT(*) as total_contratos
                FROM locadora_contratos
                WHERE data_inicio BETWEEN ? AND ?
                AND status IN ('encerrado', 'em_andamento')
            ");
            $faturamentoStmt->execute([$dataInicio, $dataFim]);
            $faturamento = $faturamentoStmt->fetch(PDO::FETCH_ASSOC);
            
            // Multas no período
            $multasStmt = $this->pdo->prepare("
                SELECT SUM(valor) as total_multas, COUNT(*) as quantidade
                FROM locadora_multas
                WHERE data_ocorrencia BETWEEN ? AND ?
            ");
            $multasStmt->execute([$dataInicio, $dataFim]);
            $multas = $multasStmt->fetch(PDO::FETCH_ASSOC);
            
            return Response::json([
                'data' => [
                    'periodo' => [
                        'data_inicio' => $dataInicio,
                        'data_fim' => $dataFim
                    ],
                    'faturamento' => $faturamento,
                    'multas' => $multas
                ]
            ]);
        } catch (Exception $e) {
            return Response::json(['error' => $e->getMessage()], 500);
        }
    }
    
    public function relatorioManutencao(Request $r): Response {
        try {
            $dataInicio = $r->query['data_inicio'] ?? date('Y-m-01');
            $dataFim = $r->query['data_fim'] ?? date('Y-m-t');
            
            // Manutenções no período
            $manutencaoStmt = $this->pdo->prepare("
                SELECT 
                    tipo,
                    COUNT(*) as quantidade,
                    SUM(valor) as valor_total
                FROM locadora_manutencao
                WHERE data_manutencao BETWEEN ? AND ?
                GROUP BY tipo
            ");
            $manutencaoStmt->execute([$dataInicio, $dataFim]);
            $manutencoes = $manutencaoStmt->fetchAll(PDO::FETCH_ASSOC);
            
            // Veículos que precisam de manutenção
            $pendentesStmt = $this->pdo->prepare("
                SELECT COUNT(*) as total
                FROM locadora_frota
                WHERE km_proxima_manutencao IS NOT NULL
                AND km_atual >= km_proxima_manutencao
                AND status != 'manutencao'
            ");
            $pendentesStmt->execute();
            $pendentes = (int)$pendentesStmt->fetchColumn();
            
            return Response::json([
                'data' => [
                    'periodo' => [
                        'data_inicio' => $dataInicio,
                        'data_fim' => $dataFim
                    ],
                    'manutencoes' => $manutencoes,
                    'pendentes' => $pendentes
                ]
            ]);
        } catch (Exception $e) {
            return Response::json(['error' => $e->getMessage()], 500);
        }
    }
}

