<?php

declare(strict_types=1);

namespace App\Repositories;

use PDO;

class ReporteRepository
{
    private PDO $db;

    public function __construct(PDO $db)
    {
        $this->db = $db;
    }

    public function ventasPorRango(string $desde, string $hasta): array
    {
        $stmt = $this->db->prepare(
            "SELECT DATE(created_at) AS fecha, COUNT(*) AS total_pedidos, COALESCE(SUM(costo_envio), 0) AS total_envios
             FROM pedidos
             WHERE created_at BETWEEN :desde AND :hasta AND estado != 'cancelado'
             GROUP BY DATE(created_at)
             ORDER BY fecha DESC"
        );
        $stmt->execute(['desde' => $desde, 'hasta' => $hasta]);

        return $stmt->fetchAll();
    }

    public function comisionesPorRepartidor(string $desde, string $hasta, float $porcentajeComision = 0.20): array
    {
        $stmt = $this->db->prepare(
            "SELECT p.repartidor_id, u.nombre AS repartidor_nombre,
                    COUNT(*) AS total_pedidos,
                    COALESCE(SUM(p.costo_envio), 0) AS monto_bruto
             FROM pedidos p
             JOIN repartidores r ON r.id = p.repartidor_id
             JOIN usuarios u ON u.id = r.usuario_id
             WHERE p.estado = 'cerrado' AND p.cerrado_at BETWEEN :desde AND :hasta
             GROUP BY p.repartidor_id, u.nombre
             ORDER BY monto_bruto DESC"
        );
        $stmt->execute(['desde' => $desde, 'hasta' => $hasta]);
        $filas = $stmt->fetchAll();

        return array_map(function ($fila) use ($porcentajeComision) {
            $comision = round(((float) $fila['monto_bruto']) * $porcentajeComision, 2);
            $fila['comision'] = $comision;
            $fila['monto_neto'] = round(((float) $fila['monto_bruto']) - $comision, 2);

            return $fila;
        }, $filas);
    }

    public function resumenGeneral(): array
    {
        $stmt = $this->db->query(
            "SELECT
                (SELECT COUNT(*) FROM pedidos) AS total_pedidos,
                (SELECT COUNT(*) FROM pedidos WHERE estado = 'cerrado') AS pedidos_cerrados,
                (SELECT COUNT(*) FROM pedidos WHERE estado NOT IN ('cerrado', 'cancelado')) AS pedidos_activos,
                (SELECT COALESCE(SUM(costo_envio), 0) FROM pedidos WHERE estado = 'cerrado') AS ingresos_envios,
                (SELECT COUNT(*) FROM tiendas WHERE activo = 1) AS tiendas_activas,
                (SELECT COUNT(*) FROM repartidores WHERE estado_disponibilidad = 'disponible') AS repartidores_disponibles"
        );

        return $stmt->fetch();
    }
}
