<?php

declare(strict_types=1);

namespace App\Repositories;

use PDO;

class RepartidorRepository
{
    private PDO $db;

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

    public function todos(): array
    {
        $stmt = $this->db->query(
            'SELECT r.*, u.nombre AS usuario_nombre, u.email AS usuario_email
             FROM repartidores r JOIN usuarios u ON u.id = r.usuario_id
             ORDER BY u.nombre'
        );

        return $stmt->fetchAll();
    }

    public function buscarPorId(int $id): ?array
    {
        $stmt = $this->db->prepare('SELECT * FROM repartidores WHERE id = :id');
        $stmt->execute(['id' => $id]);
        $repartidor = $stmt->fetch();

        return $repartidor ?: null;
    }

    public function buscarPorUsuarioId(int $usuarioId): ?array
    {
        $stmt = $this->db->prepare('SELECT * FROM repartidores WHERE usuario_id = :usuario_id');
        $stmt->execute(['usuario_id' => $usuarioId]);
        $repartidor = $stmt->fetch();

        return $repartidor ?: null;
    }

    public function listarDisponiblesEnZona(int $zonaId): array
    {
        $stmt = $this->db->prepare(
            "SELECT * FROM repartidores WHERE zona_id = :zona_id AND estado_disponibilidad = 'disponible'"
        );
        $stmt->execute(['zona_id' => $zonaId]);

        return $stmt->fetchAll();
    }

    public function crear(array $datos): int
    {
        $stmt = $this->db->prepare(
            'INSERT INTO repartidores (usuario_id, zona_id, vehiculo, placa, documento_identidad, estado_disponibilidad, created_at)
             VALUES (:usuario_id, :zona_id, :vehiculo, :placa, :documento_identidad, "desconectado", NOW())'
        );
        $stmt->execute($datos);

        return (int) $this->db->lastInsertId();
    }

    public function actualizarDisponibilidad(int $repartidorId, string $estado): void
    {
        $stmt = $this->db->prepare('UPDATE repartidores SET estado_disponibilidad = :estado WHERE id = :id');
        $stmt->execute(['estado' => $estado, 'id' => $repartidorId]);
    }
}
