<?php

namespace App\Http\Controllers\Api\V1;

use App\Http\Controllers\Controller;
use App\Http\Requests\Api\V1\MoodleApiRequest;
use App\Services\Api\ActionResolver;
use App\Services\Api\ApiResponse;
use App\Services\Api\Exceptions\SetupException;
use App\Services\Api\Exceptions\ScssException;
use App\Services\Api\Exceptions\JsException;
use App\Services\Api\Exceptions\TutorialsException;
use App\Services\Api\Exceptions\ResourcesException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;

class MoodleApiController extends Controller
{
    public function __construct(
        private ActionResolver $actionResolver
    ) {
    }

    /**
     * Maneja todas las peticiones POST a la API
     *
     * @param MoodleApiRequest $request
     * @return JsonResponse
     */
    public function handle(MoodleApiRequest $request): JsonResponse
    {
        try {
            $action = $request->input('action');
            $payload = $request->validated();

            // Ejecutar la acción correspondiente
            $data = $this->actionResolver->resolve($action, $request, $payload);

            // Retornar respuesta exitosa
            return ApiResponse::success($action, $data);

        } catch (SetupException $e) {
            // Error específico de setup con códigos personalizados
            return ApiResponse::error(
                $request->input('action', 'setup'),
                $e->getMessage(),
                $e->getApiCode(),
                [],
                $e->getHttpStatus()
            );

        } catch (ScssException $e) {
            // Error específico de scss con códigos personalizados
            return ApiResponse::error(
                $request->input('action', 'scss'),
                $e->getMessage(),
                $e->getApiCode(),
                [],
                $e->getHttpStatus()
            );

        } catch (JsException $e) {
            // Error específico de js con códigos personalizados
            return ApiResponse::error(
                $request->input('action', 'js'),
                $e->getMessage(),
                $e->getApiCode(),
                [],
                $e->getHttpStatus()
            );

        } catch (TutorialsException $e) {
            // Error específico de tutorials con códigos personalizados
            return ApiResponse::error(
                $request->input('action', 'tutorials'),
                $e->getMessage(),
                $e->getApiCode(),
                [],
                $e->getHttpStatus()
            );

        } catch (ResourcesException $e) {
            // Error específico de resources con códigos personalizados
            return ApiResponse::error(
                $request->input('action', 'resources'),
                $e->getMessage(),
                $e->getApiCode(),
                [],
                $e->getHttpStatus()
            );

        } catch (UnauthorizedHttpException $e) {
            // Error de autorización (401)
            return ApiResponse::error(
                $request->input('action', 'unknown'),
                $e->getMessage(),
                401,
                [],
                401
            );

        } catch (NotFoundHttpException $e) {
            // Recurso no encontrado (404)
            return ApiResponse::error(
                $request->input('action', 'unknown'),
                $e->getMessage(),
                404,
                [],
                404
            );

        } catch (\InvalidArgumentException $e) {
            // Acción no reconocida
            return ApiResponse::error(
                $request->input('action', 'unknown'),
                $e->getMessage(),
                400
            );

        } catch (\RuntimeException $e) {
            // Error en la ejecución de la acción
            return ApiResponse::error(
                $request->input('action', 'unknown'),
                $e->getMessage(),
                500,
                [],
                500
            );

        } catch (\Exception $e) {
            // Error genérico
            return ApiResponse::error(
                $request->input('action', 'unknown'),
                'Error interno del servidor: ' . $e->getMessage(),
                500
            );
        }
    }
}

