<?php

namespace App\Http\Controllers\Api\V1;

use App\Http\Controllers\Controller;
use App\Http\Resources\Ambiental\DoacaoResource;
use App\Services\DoacaoService;
use App\Traits\ApiResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use OpenApi\Attributes as OA;

class DoacaoController extends Controller
{
    use ApiResponse;

    public function __construct(private readonly DoacaoService $service) {}

    #[OA\Post(
        path: '/api/v1/doacoes',
        summary: 'Registrar doação de material reciclável',
        security: [['bearerAuth' => []]],
        tags: ['Doações'],
        requestBody: new OA\RequestBody(
            required: true,
            content: new OA\JsonContent(
                required: ['tipo_material', 'quantidade_kg'],
                properties: [
                    new OA\Property(property: 'eco_ponto_id', type: 'integer', nullable: true, example: 1),
                    new OA\Property(property: 'tipo_material', type: 'string', example: 'plastico'),
                    new OA\Property(property: 'quantidade_kg', type: 'number', format: 'float', example: 2.5),
                ]
            )
        ),
        responses: [
            new OA\Response(response: 201, description: 'Doação registrada'),
            new OA\Response(response: 401, description: 'Não autenticado'),
            new OA\Response(response: 422, description: 'Dados inválidos'),
        ]
    )]
    public function store(Request $request): JsonResponse
    {
        $dados = $request->validate([
            'eco_ponto_id'  => 'nullable|integer|exists:ecopontos,id',
            'tipo_material' => 'required|string|max:100',
            'quantidade_kg' => 'required|numeric|min:0.01',
        ]);

        $doacao = $this->service->registrar($request->user()->id, $dados);

        return $this->created(
            new DoacaoResource($doacao->load(['user', 'ecoponto'])),
            'Doação registrada com sucesso.'
        );
    }

    #[OA\Get(
        path: '/api/v1/doacoes/minhas',
        summary: 'Listar minhas doações (paginado)',
        security: [['bearerAuth' => []]],
        tags: ['Doações'],
        responses: [
            new OA\Response(response: 200, description: 'Lista paginada de doações do usuário'),
            new OA\Response(response: 401, description: 'Não autenticado'),
        ]
    )]
    public function minhas(Request $request): JsonResponse
    {
        $doacoes = $this->service->minhasDoacoes($request->user()->id);

        return $this->success(DoacaoResource::collection($doacoes)->response()->getData(true));
    }

    #[OA\Get(
        path: '/api/v1/doacoes',
        summary: 'Listar todas as doações — admin (paginado)',
        security: [['bearerAuth' => []]],
        tags: ['Doações'],
        parameters: [
            new OA\Parameter(name: 'status', in: 'query', required: false, schema: new OA\Schema(type: 'string', enum: ['pendente', 'confirmada', 'cancelada'])),
            new OA\Parameter(name: 'user_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')),
            new OA\Parameter(name: 'eco_ponto_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')),
        ],
        responses: [
            new OA\Response(response: 200, description: 'Lista paginada de todas as doações'),
            new OA\Response(response: 403, description: 'Sem permissão'),
        ]
    )]
    public function index(Request $request): JsonResponse
    {
        $doacoes = $this->service->listarTodas($request->only(['status', 'user_id', 'eco_ponto_id']));

        return $this->success(DoacaoResource::collection($doacoes)->response()->getData(true));
    }

    #[OA\Patch(
        path: '/api/v1/doacoes/{id}/confirmar',
        summary: 'Confirmar doação (admin/parceiro)',
        security: [['bearerAuth' => []]],
        tags: ['Doações'],
        parameters: [new OA\Parameter(name: 'id', in: 'path', required: true, schema: new OA\Schema(type: 'integer'))],
        responses: [
            new OA\Response(response: 200, description: 'Doação confirmada'),
            new OA\Response(response: 404, description: 'Não encontrada'),
            new OA\Response(response: 422, description: 'Status inválido para confirmação'),
        ]
    )]
    public function confirmar(int $id): JsonResponse
    {
        $doacao = $this->service->confirmar($id);

        return $this->success(new DoacaoResource($doacao), 'Doação confirmada com sucesso.');
    }

    #[OA\Patch(
        path: '/api/v1/doacoes/{id}/cancelar',
        summary: 'Cancelar doação (admin/parceiro)',
        security: [['bearerAuth' => []]],
        tags: ['Doações'],
        parameters: [new OA\Parameter(name: 'id', in: 'path', required: true, schema: new OA\Schema(type: 'integer'))],
        responses: [
            new OA\Response(response: 200, description: 'Doação cancelada'),
            new OA\Response(response: 404, description: 'Não encontrada'),
            new OA\Response(response: 422, description: 'Já cancelada'),
        ]
    )]
    public function cancelar(int $id): JsonResponse
    {
        $doacao = $this->service->cancelar($id);

        return $this->success(new DoacaoResource($doacao), 'Doação cancelada.');
    }
}
