import java.time.LocalDate;
import java.time.Duration;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;

public class ReporteParqueo {

    private static final DateTimeFormatter soloFecha = DateTimeFormatter.ofPattern("dd/MM/yyyy");

    public void vehiculosDia(GestorParqueo gestorParqueo, LocalDate fecha) {
        
        ArrayList<TiqueteParqueo> tiquetes = gestorParqueo.getTiquetesDia(fecha);

        String fechaFormateada = fecha.format(soloFecha);

        if (tiquetes.isEmpty()) {
            System.out.println("No hay vehículos registrados para la fecha: " + fechaFormateada);
            return;
        }

        System.out.println("Vehículos que usaron el parqueo el día " + fechaFormateada + ":");
        for (TiqueteParqueo tiquete : tiquetes) {

            String placa = tiquete.getVehiculo().getPlaca();
            String tipo = tipoVehiculoTexto(tiquete.getVehiculo().getTipo());
            String entrada = tiquete.getHoraEntrada().format(soloFecha);
            String salida = "Aún parqueado";
            if (tiquete.getHoraSalida() != null) {
                salida = tiquete.getHoraSalida().format(soloFecha);
            }

            System.out.println(
                    "Placa: " + placa + " | Tipo: " + tipo + " | Entrada: " + entrada + " | Salida: " + salida);
        }
    }

    public void totalUtilServicio(GestorParqueo gestorParqueo, LocalDate fecha) {

        ArrayList<TiqueteParqueo> tiquetes = gestorParqueo.getTiquetesDia(fecha);
        int totalPorHora = 0;
        int totalPorDia = 0;

        for (TiqueteParqueo tiquete : tiquetes) {
            if (tiquete.getHoraSalida() == null) {
                continue;
            }

            if (tiquete.getModalidad() == TiqueteParqueo.TipoServicio.POR_HORA) {
                totalPorHora += tiquete.getMontoTotal();
            } else {
                totalPorDia += tiquete.getMontoTotal();
            }
        }

        String fechaFormateada = fecha.format(soloFecha);
        System.out.println("Total recaudado por servicio el día " + fechaFormateada + ":");
        System.out.println("Servicio por hora: CRC " + totalPorHora);
        System.out.println("Servicio por día: CRC " + totalPorDia);
    }

    public void estadisticasBasicas(GestorParqueo gestorParqueo, LocalDate fecha) {
        ArrayList<TiqueteParqueo> tiquetes = gestorParqueo.getTiquetesDia(fecha);
        int vehiculosAtendidos = tiquetes.size();
        long minutosTotales = 0;

        for (TiqueteParqueo tiquete : tiquetes) {
            if (tiquete.getHoraSalida() != null) {
                minutosTotales += Duration.between(tiquete.getHoraEntrada(), tiquete.getHoraSalida()).toMinutes();
            }
        }

        double horasTotales = minutosTotales / 60.0;
        int capacidad = gestorParqueo.getCapacidadMaxima();
        int ocupadosActuales = capacidad - gestorParqueo.espaciosDisponibles();
        double ocupacionActual = (ocupadosActuales * 100.0) / capacidad;

        String fechaFormateada = fecha.format(soloFecha);
        System.out.println("Estadísticas básicas del día " + fechaFormateada + ":");
        System.out.println("Sumatoria de horas de uso: " + String.format("%.2f", horasTotales));
        System.out.println("Cantidad de vehículos atendidos: " + vehiculosAtendidos);
        System.out.println("Porcentaje de ocupación actual: " + String.format("%.2f", ocupacionActual) + "%");
    }

    private String tipoVehiculoTexto(int tipo) {
        if (tipo == 1) {
            return "Automóvil";
        }
        if (tipo == 2) {
            return "Motocicleta";
        }
        if (tipo == 3) {
            return "Camión";
        }
        return "Desconocido";
    }
}
