<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Http;
use Carbon\Carbon;

class FeriadosController extends Controller
{
    /**
     * ✅ Obtener todos los feriados (API + BD) con auto-sincronización
     */
    public function index($domain_id, $year)
    {
        try {
            Log::info('=== INICIO GET FERIADOS ===', [
                'domain' => $domain_id,
                'year' => $year
            ]);

            // 1. Sincronizar feriados de API
            $feriadosAPI = $this->obtenerFeriadosAPI($year);

            if ($feriadosAPI->isNotEmpty()) {
                $this->sincronizarFeriadosOficiales($feriadosAPI, $domain_id);
            }

            // 2. ✅ NUEVO: Auto-sincronizar feriados adicionales peruanos
            $insertadosAdicionales = $this->sincronizarFeriadosAdicionalesPeru($domain_id, $year);

            // 3. Obtener todos los feriados de BD
            $feriadosDB = DB::table('feriados')
                ->where('domain_id', $domain_id)
                ->whereYear('fecha', $year)
                ->where('activo', 1)
                ->whereNull('deleted_at')
                ->orderBy('fecha')
                ->get();

            // 4. Formatear respuesta
            $resultado = $feriadosDB->map(function ($f) {
                return [
                    'id' => $f->id,
                    'fecha' => $f->fecha,
                    'nombre' => $f->nombre,
                    'descripcion' => $f->descripcion,
                    'tipo' => $f->tipo,
                    'activo' => (bool) $f->activo,
                    'puede_editar' => $f->tipo === 'personalizado',
                    'reciente' => $f->tipo === 'oficial_adicional' // ✅ Marca feriados agregados manualmente
                ];
            });

            Log::info('=== FIN GET FERIADOS ===', [
                'total' => $resultado->count(),
                'insertados_adicionales' => $insertadosAdicionales
            ]);

            return response()->json([
                'success' => true,
                'data' => $resultado,
                'year' => $year,
                'meta' => [
                    'total_feriados' => $resultado->count(),
                    'nuevos_agregados' => $insertadosAdicionales,
                    'requiere_revision' => $insertadosAdicionales > 0 // ✅ Flag para banner
                ]
            ]);
        } catch (\Exception $e) {
            Log::error('ERROR GET FERIADOS:', [
                'message' => $e->getMessage(),
                'line' => $e->getLine()
            ]);

            return response()->json([
                'success' => false,
                'message' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * ✅ NUEVO: Sincronizar feriados adicionales oficiales de Perú
     * que no están en la API internacional
     */
    private function sincronizarFeriadosAdicionalesPeru($domain_id, $year)
    {
        $feriadosAdicionales = [
            [
                'fecha' => "{$year}-06-07",
                'nombre' => 'Batalla de Arica y Día de la Bandera',
                'descripcion' => 'Feriado nacional - Ley N° 27425 (2001)',
                'tipo' => 'oficial_adicional'
            ],
            [
                'fecha' => "{$year}-07-23",
                'nombre' => 'Día de la Fuerza Aérea del Perú',
                'descripcion' => 'Feriado nacional - Ley N° 30979 (2019)',
                'tipo' => 'oficial_adicional'
            ],
            [
                'fecha' => "{$year}-08-06",
                'nombre' => 'Batalla de Junín',
                'descripcion' => 'Feriado nacional - Ley N° 31530 (2022)',
                'tipo' => 'oficial_adicional'
            ],
            [
                'fecha' => "{$year}-12-09",
                'nombre' => 'Batalla de Ayacucho',
                'descripcion' => 'Feriado nacional - Ley N° 28290 (2004)',
                'tipo' => 'oficial_adicional'
            ]
        ];

        $insertados = 0;

        foreach ($feriadosAdicionales as $feriado) {
            try {
                $existe = DB::table('feriados')
                    ->where('fecha', $feriado['fecha'])
                    ->where('domain_id', $domain_id)
                    ->whereNull('deleted_at')
                    ->exists();

                if (!$existe) {
                    DB::table('feriados')->insert([
                        'fecha' => $feriado['fecha'],
                        'nombre' => $feriado['nombre'],
                        'descripcion' => $feriado['descripcion'],
                        'tipo' => $feriado['tipo'],
                        'activo' => 1,
                        'domain_id' => $domain_id,
                        'created_at' => Carbon::now(),
                        'updated_at' => Carbon::now()
                    ]);

                    $insertados++;
                    Log::info("✓ Feriado adicional insertado: {$feriado['nombre']}");
                }
            } catch (\Exception $e) {
                Log::error("Error insertando feriado adicional:", [
                    'fecha' => $feriado['fecha'],
                    'error' => $e->getMessage()
                ]);
            }
        }

        return $insertados;
    }

    /**
     * ✅ Obtener feriados desde API pública usando cURL
     */
    private function obtenerFeriadosAPI($year)
    {
        try {
            $url = "https://date.nager.at/api/v3/publicholidays/{$year}/PE";

            Log::info('🌐 Llamando API externa', ['url' => $url]);

            $ch = curl_init();

            curl_setopt_array($ch, [
                CURLOPT_URL => $url,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_TIMEOUT => 10,
                CURLOPT_FOLLOWLOCATION => true,
                CURLOPT_SSL_VERIFYPEER => false,
                CURLOPT_HTTPHEADER => [
                    'Accept: application/json',
                    'User-Agent: DigitalPlatform/1.0'
                ]
            ]);

            $response = curl_exec($ch);
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            $curlError = curl_error($ch);

            curl_close($ch);

            Log::info('📡 Respuesta de API', [
                'http_code' => $httpCode,
                'has_response' => !empty($response),
                'curl_error' => $curlError ?: 'ninguno'
            ]);

            if ($httpCode === 200 && $response) {
                $data = json_decode($response, true);

                if (json_last_error() !== JSON_ERROR_NONE) {
                    Log::error('❌ Error parseando JSON', [
                        'json_error' => json_last_error_msg()
                    ]);
                    return collect();
                }

                Log::info('✅ API respondió exitosamente', [
                    'cantidad_feriados' => count($data ?? [])
                ]);

                return collect($data ?? []);
            }

            Log::warning('⚠️ API no disponible o respuesta vacía', [
                'http_code' => $httpCode
            ]);

            return collect();
        } catch (\Exception $e) {
            Log::error('❌ Error llamando API:', [
                'error' => $e->getMessage(),
                'trace' => $e->getTraceAsString()
            ]);
            return collect();
        }
    }

    /**
     * ✅ Sincronizar feriados oficiales con BD
     */
    private function sincronizarFeriadosOficiales($feriadosAPI, $domain_id)
    {
        Log::info('🔄 Sincronizando feriados oficiales', [
            'domain_id' => $domain_id,
            'cantidad_api' => $feriadosAPI->count()
        ]);

        $insertados = 0;
        $existentes = 0;

        foreach ($feriadosAPI as $feriado) {
            $fecha = $feriado['date'];

            // Verificar si ya existe
            $existe = DB::table('feriados')
                ->where('fecha', $fecha)
                ->where('domain_id', $domain_id)
                ->where('tipo', 'oficial')
                ->exists();

            if (!$existe) {
                try {
                    DB::table('feriados')->insert([
                        'fecha' => $fecha,
                        'nombre' => $feriado['localName'] ?? $feriado['name'],
                        'descripcion' => 'Feriado oficial de Perú',
                        'tipo' => 'oficial',
                        'activo' => 1,
                        'domain_id' => $domain_id,
                        'created_at' => Carbon::now(),
                        'updated_at' => Carbon::now()
                    ]);

                    $insertados++;

                    Log::info("✅ Feriado insertado: {$feriado['localName']} - {$fecha}");
                } catch (\Exception $e) {
                    Log::error("❌ Error insertando feriado: {$fecha}", [
                        'error' => $e->getMessage()
                    ]);
                }
            } else {
                $existentes++;
            }
        }

        Log::info('✅ Sincronización completada', [
            'insertados' => $insertados,
            'existentes' => $existentes
        ]);
    }




    /**
     * ✅ Crear feriado personalizado
     * POST /api/feriados
     */
    public function store(Request $request)
    {
        try {
            $validator = Validator::make($request->all(), [
                'fecha' => 'required|date',
                'nombre' => 'required|string|max:255',
                'descripcion' => 'nullable|string',
                'domain_id' => 'required|integer'
            ]);

            if ($validator->fails()) {
                return response()->json([
                    'success' => false,
                    'errors' => $validator->errors()
                ], 422);
            }

            $data = $validator->validated();

            // Verificar duplicado
            $existe = DB::table('feriados')
                ->where('fecha', $data['fecha'])
                ->where('domain_id', $data['domain_id'])
                ->whereNull('deleted_at')
                ->exists();

            if ($existe) {
                return response()->json([
                    'success' => false,
                    'message' => 'Ya existe un feriado en esa fecha'
                ], 422);
            }

            DB::beginTransaction();

            $id = DB::table('feriados')->insertGetId([
                'fecha' => $data['fecha'],
                'nombre' => $data['nombre'],
                'descripcion' => $data['descripcion'] ?? null,
                'tipo' => 'personalizado',
                'activo' => 1,
                'domain_id' => $data['domain_id'],
                'created_at' => Carbon::now(),
                'updated_at' => Carbon::now()
            ]);

            DB::commit();

            $feriado = DB::table('feriados')->find($id);

            return response()->json([
                'success' => true,
                'message' => 'Feriado creado exitosamente',
                'data' => $feriado
            ], 201);
        } catch (\Exception $e) {
            DB::rollBack();
            Log::error('Error creando feriado:', [
                'error' => $e->getMessage()
            ]);

            return response()->json([
                'success' => false,
                'message' => 'Error al crear el feriado',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * ✅ Actualizar feriado personalizado
     * PUT /api/feriados/{id}
     */
    public function update(Request $request, $id)
    {
        try {
            $feriado = DB::table('feriados')
                ->where('id', $id)
                ->whereNull('deleted_at')
                ->first();

            if (!$feriado) {
                return response()->json([
                    'success' => false,
                    'message' => 'Feriado no encontrado'
                ], 404);
            }

            // No permitir editar oficiales
            if ($feriado->tipo === 'oficial') {
                return response()->json([
                    'success' => false,
                    'message' => 'No se pueden editar feriados oficiales'
                ], 403);
            }

            $validator = Validator::make($request->all(), [
                'fecha' => 'required|date',
                'nombre' => 'required|string|max:255',
                'descripcion' => 'nullable|string',
            ]);

            if ($validator->fails()) {
                return response()->json([
                    'success' => false,
                    'errors' => $validator->errors()
                ], 422);
            }

            $data = $validator->validated();

            DB::beginTransaction();

            DB::table('feriados')
                ->where('id', $id)
                ->update([
                    'fecha' => $data['fecha'],
                    'nombre' => $data['nombre'],
                    'descripcion' => $data['descripcion'] ?? null,
                    'updated_at' => Carbon::now()
                ]);

            DB::commit();

            $feriadoActualizado = DB::table('feriados')->find($id);

            return response()->json([
                'success' => true,
                'message' => 'Feriado actualizado exitosamente',
                'data' => $feriadoActualizado
            ], 200);
        } catch (\Exception $e) {
            DB::rollBack();
            Log::error('Error actualizando feriado:', [
                'id' => $id,
                'error' => $e->getMessage()
            ]);

            return response()->json([
                'success' => false,
                'message' => 'Error al actualizar el feriado',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * ✅ Eliminar feriado personalizado (soft delete)
     * DELETE /api/feriados/{id}
     */
    public function destroy($id)
    {
        try {
            $feriado = DB::table('feriados')
                ->where('id', $id)
                ->whereNull('deleted_at')
                ->first();

            if (!$feriado) {
                return response()->json([
                    'success' => false,
                    'message' => 'Feriado no encontrado'
                ], 404);
            }

            // No permitir eliminar oficiales
            if ($feriado->tipo === 'oficial') {
                return response()->json([
                    'success' => false,
                    'message' => 'No se pueden eliminar feriados oficiales. Puedes desactivarlos.'
                ], 403);
            }

            DB::table('feriados')
                ->where('id', $id)
                ->update([
                    'deleted_at' => Carbon::now()
                ]);

            return response()->json([
                'success' => true,
                'message' => 'Feriado eliminado exitosamente'
            ], 200);
        } catch (\Exception $e) {
            Log::error('Error eliminando feriado:', [
                'id' => $id,
                'error' => $e->getMessage()
            ]);

            return response()->json([
                'success' => false,
                'message' => 'Error al eliminar el feriado',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * ✅ Activar/Desactivar feriado
     * PATCH /api/feriados/{id}/toggle
     */
    public function toggleActivo($id)
    {
        try {
            $feriado = DB::table('feriados')
                ->where('id', $id)
                ->whereNull('deleted_at')
                ->first();

            if (!$feriado) {
                return response()->json([
                    'success' => false,
                    'message' => 'Feriado no encontrado'
                ], 404);
            }

            $nuevoEstado = !$feriado->activo;

            DB::table('feriados')
                ->where('id', $id)
                ->update([
                    'activo' => $nuevoEstado,
                    'updated_at' => Carbon::now()
                ]);

            return response()->json([
                'success' => true,
                'message' => $nuevoEstado ? 'Feriado activado' : 'Feriado desactivado',
                'activo' => $nuevoEstado
            ], 200);
        } catch (\Exception $e) {
            Log::error('Error cambiando estado del feriado:', [
                'id' => $id,
                'error' => $e->getMessage()
            ]);

            return response()->json([
                'success' => false,
                'message' => 'Error al cambiar el estado',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * ✅ Verificar si una fecha es feriado
     * GET /api/feriados/verificar/{domain_id}/{fecha}
     */
    public function verificarFeriado($domain_id, $fecha)
    {
        $esFeriado = DB::table('feriados')
            ->where('domain_id', $domain_id)
            ->where('fecha', $fecha)
            ->where('activo', 1)
            ->whereNull('deleted_at')
            ->exists();

        return response()->json([
            'success' => true,
            'es_feriado' => $esFeriado,
            'fecha' => $fecha
        ], 200);
    }
}
