<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Services\SATDescargaMasivaService;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Validator;
use Exception;

class SATController extends Controller
{
    private SATDescargaMasivaService $satService;

    public function __construct(SATDescargaMasivaService $satService)
    {
        $this->satService = $satService;
    }

    /**
     * API 1: Crear una solicitud de descarga masiva
     *
     * @param Request $request
     * @return JsonResponse
     */
    public function crearSolicitud(Request $request): JsonResponse
    {
        // Validar los parámetros de entrada
        $validator = Validator::make($request->all(), [
            'fecha_inicio' => 'required|date_format:Y-m-d H:i:s',
            'fecha_fin' => 'required|date_format:Y-m-d H:i:s|after:fecha_inicio',
        ], [
            'fecha_inicio.required' => 'La fecha de inicio es requerida',
            'fecha_inicio.date_format' => 'La fecha de inicio debe tener el formato: Y-m-d H:i:s (ejemplo: 2019-01-13 00:00:00)',
            'fecha_fin.required' => 'La fecha de fin es requerida',
            'fecha_fin.date_format' => 'La fecha de fin debe tener el formato: Y-m-d H:i:s (ejemplo: 2019-01-13 23:59:59)',
            'fecha_fin.after' => 'La fecha de fin debe ser posterior a la fecha de inicio',
        ]);

        if ($validator->fails()) {
            return response()->json([
                'success' => false,
                'message' => 'Error de validación',
                'errors' => $validator->errors()
            ], 422);
        }

        $resultado = $this->satService->crearConsulta(
            $request->fecha_inicio,
            $request->fecha_fin
        );

        return response()->json($resultado, 200);

    }

    /**
     * API 2: Verificar el estado de una solicitud
     *
     * @param string $requestId
     * @return JsonResponse
     */
    public function verificarSolicitud(string $requestId): JsonResponse
    {
        // Validar que el requestId no esté vacío
        if (empty($requestId)) {
            return response()->json([
                'success' => false,
                'message' => 'El request_id es requerido'
            ], 422);
        }

        try {
            $resultado = $this->satService->verificarConsulta($requestId);

            return response()->json($resultado, 200);
        } catch (Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'Error al verificar la solicitud',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * API 3: Descargar los paquetes de una solicitud
     *
     * @param string $requestId
     * @return JsonResponse
     */
    public function descargarPaquetes(string $requestId): JsonResponse
    {
        // Validar que el requestId no esté vacío
        if (empty($requestId)) {
            return response()->json([
                'success' => false,
                'message' => 'El request_id es requerido'
            ], 422);
        }

        try {
            $resultado = $this->satService->descargarPaquetes($requestId);

            return response()->json($resultado, 200);
        } catch (Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'Error al descargar los paquetes',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * API 4: Extraer XMLs de un paquete ZIP
     *
     * @param string $packageId
     * @return JsonResponse
     */
    public function extraerXMLs(string $packageId): JsonResponse
    {
        // Validar que el packageId no esté vacío
        if (empty($packageId)) {
            return response()->json([
                'success' => false,
                'message' => 'El package_id es requerido'
            ], 422);
        }

        try {
            $resultado = $this->satService->extraerXMLs($packageId);

            return response()->json($resultado, 200);
        } catch (Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'Error al extraer los XMLs',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * API 5: Leer metadata de un paquete ZIP
     *
     * @param string $packageId
     * @return JsonResponse
     */
    public function leerMetadata(string $packageId): JsonResponse
    {
        // Validar que el packageId no esté vacío
        if (empty($packageId)) {
            return response()->json([
                'success' => false,
                'message' => 'El package_id es requerido'
            ], 422);
        }

        try {
            $resultado = $this->satService->leerMetadata($packageId);

            return response()->json($resultado, 200);
        } catch (Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'Error al leer la metadata',
                'error' => $e->getMessage()
            ], 500);
        }
    }
}
