<?php

declare(strict_types=1);

namespace App\Controllers;

use App\Repositories\RepartidorRepository;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;

class RepartidorController
{
    private RepartidorRepository $repartidores;

    public function __construct(RepartidorRepository $repartidores)
    {
        $this->repartidores = $repartidores;
    }

    public function listar(Request $request, Response $response): Response
    {
        return $this->json($response, $this->repartidores->todos());
    }

    /// Perfil del repartidor autenticado (resuelto desde el usuario_id del JWT).
    public function yo(Request $request, Response $response): Response
    {
        $usuarioId = (int) $request->getAttribute('usuario_id');
        $repartidor = $this->repartidores->buscarPorUsuarioId($usuarioId);

        if (!$repartidor) {
            return $this->json($response, ['error' => 'El usuario autenticado no es un repartidor'], 403);
        }

        return $this->json($response, $repartidor);
    }

    public function ver(Request $request, Response $response, array $args): Response
    {
        $repartidor = $this->repartidores->buscarPorId((int) $args['id']);

        if (!$repartidor) {
            return $this->json($response, ['error' => 'Repartidor no encontrado'], 404);
        }

        return $this->json($response, $repartidor);
    }

    public function disponiblesEnZona(Request $request, Response $response, array $args): Response
    {
        return $this->json($response, $this->repartidores->listarDisponiblesEnZona((int) $args['zonaId']));
    }

    public function crear(Request $request, Response $response): Response
    {
        $body = (array) $request->getParsedBody();

        if (empty($body['usuario_id'])) {
            return $this->json($response, ['error' => 'usuario_id es requerido'], 422);
        }

        $id = $this->repartidores->crear([
            'usuario_id' => (int) $body['usuario_id'],
            'zona_id' => isset($body['zona_id']) ? (int) $body['zona_id'] : null,
            'vehiculo' => (string) ($body['vehiculo'] ?? 'moto'),
            'placa' => (string) ($body['placa'] ?? ''),
            'documento_identidad' => (string) ($body['documento_identidad'] ?? ''),
        ]);

        return $this->json($response, $this->repartidores->buscarPorId($id), 201);
    }

    /**
     * Toggle de disponibilidad usado por la app Repartidor (disponible/ocupado/desconectado).
     */
    public function actualizarDisponibilidad(Request $request, Response $response): Response
    {
        $usuarioId = (int) $request->getAttribute('usuario_id');
        $repartidor = $this->repartidores->buscarPorUsuarioId($usuarioId);

        if (!$repartidor) {
            return $this->json($response, ['error' => 'El usuario autenticado no es un repartidor'], 403);
        }

        $body = (array) $request->getParsedBody();
        $estado = (string) ($body['estado'] ?? '');

        if (!in_array($estado, ['disponible', 'ocupado', 'desconectado'], true)) {
            return $this->json($response, ['error' => 'Estado inválido'], 422);
        }

        $this->repartidores->actualizarDisponibilidad((int) $repartidor['id'], $estado);

        return $this->json($response, ['ok' => true, 'estado' => $estado]);
    }

    private function json(Response $response, $data, int $status = 200): Response
    {
        $response->getBody()->write(json_encode($data));

        return $response->withHeader('Content-Type', 'application/json')->withStatus($status);
    }
}
