<?php

namespace App\Http\Controllers;

use App\Models\Capacitacion;
use App\Models\Docente;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Validation\Rule;

class CapacitacionController extends Controller
{
    public function index()
    {
        try {
            $capacitaciones = Capacitacion::select('capacitaciones.*')
                ->where('capacitaciones.estado', 1)
                ->orderBy('capacitaciones.fecha', 'desc')
                ->get()
                ->map(function ($capacitacion) {
                    // Agregar el nombre del estado basado en el número
                    $estados = [
                        1 => ['nombre' => 'Pendiente', 'color' => '#F59E0B'],
                        2 => ['nombre' => 'En proceso', 'color' => '#3B82F6'], 
                        3 => ['nombre' => 'Finalizado', 'color' => '#10B981']
                    ];
                    
                    $capacitacion->estado_nombre = $estados[$capacitacion->estado_capacitacion]['nombre'] ?? 'Sin estado';
                    $capacitacion->estado_color = $estados[$capacitacion->estado_capacitacion]['color'] ?? '#6B7280';
                    
                    return $capacitacion;
                });

            return response()->json([
                'responseCode' => 0,
                'response' => $capacitaciones,
                'msgResultado' => 'Capacitaciones obtenidas correctamente'
            ], 200);

        } catch (\Exception $e) {
            return response()->json([
                'responseCode' => 1,
                'response' => null,
                'msgResultado' => 'Error al obtener las capacitaciones: ' . $e->getMessage()
            ], 500);
        }
    }

    public function store(Request $request)
    {
        try {
            $rules = [
                'codigo' => 'required|string|max:25|unique:capacitaciones,codigo',
                'nombre' => 'required|string|max:255|min:3',
                'horas' => 'required|integer|min:1|max:500',
                'sylabus' => 'nullable|string|max:5000',
                'temas' => 'nullable|string|max:5000',
                'estado_capacitacion' => 'required|integer|in:1,2,3',
                'fecha' => 'required|date',
                
                // Nuevos campos para participante
                'nombres_apellidos' => 'required|string|max:255|min:3',
                'documento_identidad' => 'required|string|max:20|min:8|unique:capacitaciones,documento_identidad',
                'celular' => 'required|string|max:15|min:9',
                'cv_file' => 'required|file|mimes:pdf,doc,docx|max:5120', // 5MB max
            ];

            $messages = [
                'codigo.unique' => 'El código ya existe en el sistema',
                'nombre.min' => 'El nombre debe tener al menos 3 caracteres',
                'horas.min' => 'Las horas deben ser mayor a 0',
                'horas.max' => 'Las horas no pueden exceder 500',
                'estado_capacitacion.required' => 'El estado de la capacitación es requerido',
                'estado_capacitacion.in' => 'El estado debe ser: 1=Pendiente, 2=En proceso, 3=Finalizado',
                'nombres_apellidos.required' => 'Los nombres y apellidos son requeridos',
                'nombres_apellidos.min' => 'Los nombres y apellidos deben tener al menos 3 caracteres',
                'documento_identidad.required' => 'El documento de identidad es requerido',
                'documento_identidad.unique' => 'Ya existe una capacitación con este documento de identidad',
                'documento_identidad.min' => 'El documento debe tener al menos 8 caracteres',
                'celular.required' => 'El celular es requerido',
                'celular.min' => 'El celular debe tener al menos 9 dígitos',
                'cv_file.required' => 'El curriculum vitae es requerido',
                'cv_file.mimes' => 'El CV debe ser un archivo PDF, DOC o DOCX',
                'cv_file.max' => 'El CV no puede superar los 5MB',
            ];

            $this->validate($request, $rules, $messages);

            // Manejar la subida del archivo CV
            $cvPath = null;
            $cvOriginalName = null;
            
            if ($request->hasFile('cv_file')) {
                $file = $request->file('cv_file');
                $cvOriginalName = $file->getClientOriginalName();
                
                // Generar nombre único para el archivo
                $fileName = time() . '_' . $request->documento_identidad . '.' . $file->getClientOriginalExtension();
                
                // Guardar en storage/app/public/cvs
                $cvPath = $file->storeAs('cvs', $fileName, 'public');
            }

            // Crear la capacitación con los datos existentes y nuevos
            $capacitacionData = [
                'codigo' => $request->codigo,
                'nombre' => $request->nombre,
                'horas' => $request->horas,
                'sylabus' => $request->sylabus,
                'temas' => $request->temas,
                'estado_capacitacion' => $request->estado_capacitacion,
                'fecha' => $request->fecha,
                'estado' => 1,
                // Nuevos campos
                'nombres_apellidos' => $request->nombres_apellidos,
                'documento_identidad' => $request->documento_identidad,
                'celular' => $request->celular,
                'cv_path' => $cvPath,
                'cv_original_name' => $cvOriginalName,
            ];

            $capacitacion = Capacitacion::create($capacitacionData);

            return response()->json([
                'responseCode' => 0,
                'response' => $capacitacion,
                'msgResultado' => 'Capacitación creada correctamente'
            ], 201);

        } catch (\Illuminate\Validation\ValidationException $e) {
            return response()->json([
                'responseCode' => 1,
                'response' => null,
                'msgResultado' => 'Errores de validación',
                'errors' => $e->errors()
            ], 422);

        } catch (\Exception $e) {
            return response()->json([
                'responseCode' => 1,
                'response' => null,
                'msgResultado' => 'Error al crear la capacitación: ' . $e->getMessage()
            ], 500);
        }
    }

    public function show($id)
    {
        try {
            $capacitacion = Capacitacion::where('id', $id)
                ->where('estado', 1)
                ->first();

            if (!$capacitacion) {
                return response()->json([
                    'responseCode' => 1,
                    'response' => null,
                    'msgResultado' => 'Capacitación no encontrada'
                ], 404);
            }

            // Agregar nombres de estado
            $estados = [
                1 => ['nombre' => 'Pendiente', 'color' => '#F59E0B'],
                2 => ['nombre' => 'En proceso', 'color' => '#3B82F6'], 
                3 => ['nombre' => 'Finalizado', 'color' => '#10B981']
            ];
            
            $capacitacion->estado_nombre = $estados[$capacitacion->estado_capacitacion]['nombre'] ?? 'Sin estado';
            $capacitacion->estado_color = $estados[$capacitacion->estado_capacitacion]['color'] ?? '#6B7280';

            return response()->json([
                'responseCode' => 0,
                'response' => $capacitacion,
                'msgResultado' => 'Capacitación obtenida correctamente'
            ], 200);

        } catch (\Exception $e) {
            return response()->json([
                'responseCode' => 1,
                'response' => null,
                'msgResultado' => 'Error al obtener la capacitación: ' . $e->getMessage()
            ], 500);
        }
    }

    public function update(Request $request, $id)
    {
        try {
            $capacitacion = Capacitacion::find($id);
            
            if (!$capacitacion || $capacitacion->estado == 0) {
                return response()->json([
                    'responseCode' => 1,
                    'response' => null,
                    'msgResultado' => 'Capacitación no encontrada'
                ], 404);
            }

            $rules = [
                'codigo' => [
                    'required',
                    'string',
                    'max:25',
                    Rule::unique('capacitaciones')->ignore($id)
                ],
                'nombre' => 'required|string|max:255|min:3',
                'horas' => 'required|integer|min:1|max:500',
                'sylabus' => 'nullable|string|max:5000',
                'temas' => 'nullable|string|max:5000',
                'estado_capacitacion' => 'required|integer|in:1,2,3',
                'fecha' => 'required|date',
                
                // Nuevos campos
                'nombres_apellidos' => 'required|string|max:255|min:3',
                'documento_identidad' => [
                    'required',
                    'string',
                    'max:20',
                    'min:8',
                    Rule::unique('capacitaciones')->ignore($id)
                ],
                'celular' => 'required|string|max:15|min:9',
                'cv_file' => 'nullable|file|mimes:pdf,doc,docx|max:5120', // No requerido en actualización
            ];

            $messages = [
                'codigo.unique' => 'El código ya existe en el sistema',
                'nombre.min' => 'El nombre debe tener al menos 3 caracteres',
                'horas.min' => 'Las horas deben ser mayor a 0',
                'horas.max' => 'Las horas no pueden exceder 500',
                'estado_capacitacion.required' => 'El estado de la capacitación es requerido',
                'estado_capacitacion.in' => 'El estado debe ser: 1=Pendiente, 2=En proceso, 3=Finalizado',
                'nombres_apellidos.required' => 'Los nombres y apellidos son requeridos',
                'nombres_apellidos.min' => 'Los nombres y apellidos deben tener al menos 3 caracteres',
                'documento_identidad.required' => 'El documento de identidad es requerido',
                'documento_identidad.unique' => 'Ya existe una capacitación con este documento de identidad',
                'documento_identidad.min' => 'El documento debe tener al menos 8 caracteres',
                'celular.required' => 'El celular es requerido',
                'celular.min' => 'El celular debe tener al menos 9 dígitos',
                'cv_file.mimes' => 'El CV debe ser un archivo PDF, DOC o DOCX',
                'cv_file.max' => 'El CV no puede superar los 5MB',
            ];

            $this->validate($request, $rules, $messages);

            // Preparar datos para actualización
            $updateData = [
                'codigo' => $request->codigo,
                'nombre' => $request->nombre,
                'horas' => $request->horas,
                'sylabus' => $request->sylabus,
                'temas' => $request->temas,
                'idEstado' => $request->idEstado,
                'fecha' => $request->fecha,
                // Nuevos campos
                'nombres_apellidos' => $request->nombres_apellidos,
                'documento_identidad' => $request->documento_identidad,
                'celular' => $request->celular,
            ];
            
            // Manejar archivo CV si se proporciona uno nuevo
            if ($request->hasFile('cv_file')) {
                $file = $request->file('cv_file');
                
                // Eliminar archivo anterior si existe
                if ($capacitacion->cv_path && Storage::disk('public')->exists($capacitacion->cv_path)) {
                    Storage::disk('public')->delete($capacitacion->cv_path);
                }
                
                // Subir nuevo archivo
                $cvOriginalName = $file->getClientOriginalName();
                $fileName = time() . '_' . $request->documento_identidad . '.' . $file->getClientOriginalExtension();
                $cvPath = $file->storeAs('cvs', $fileName, 'public');
                
                $updateData['cv_path'] = $cvPath;
                $updateData['cv_original_name'] = $cvOriginalName;
            }

            $capacitacion->update($updateData);

            return response()->json([
                'responseCode' => 0,
                'response' => $capacitacion,
                'msgResultado' => 'Capacitación actualizada correctamente'
            ], 200);

        } catch (\Illuminate\Validation\ValidationException $e) {
            return response()->json([
                'responseCode' => 1,
                'response' => null,
                'msgResultado' => 'Errores de validación',
                'errors' => $e->errors()
            ], 422);

        } catch (\Exception $e) {
            return response()->json([
                'responseCode' => 1,
                'response' => null,
                'msgResultado' => 'Error al actualizar la capacitación: ' . $e->getMessage()
            ], 500);
        }
    }

    public function destroy($id)
    {
        try {
            $capacitacion = Capacitacion::find($id);
            
            if (!$capacitacion || $capacitacion->estado == 0) {
                return response()->json([
                    'responseCode' => 1,
                    'response' => null,
                    'msgResultado' => 'Capacitación no encontrada'
                ], 404);
            }

            $capacitacion->estado = 0;
            $capacitacion->save();

            // Opcional: También eliminar el archivo CV físicamente
            // if ($capacitacion->cv_path && Storage::disk('public')->exists($capacitacion->cv_path)) {
            //     Storage::disk('public')->delete($capacitacion->cv_path);
            // }

            return response()->json([
                'responseCode' => 0,
                'response' => $capacitacion,
                'msgResultado' => 'Capacitación eliminada correctamente'
            ], 200);

        } catch (\Exception $e) {
            return response()->json([
                'responseCode' => 1,
                'response' => null,
                'msgResultado' => 'Error al eliminar la capacitación: ' . $e->getMessage()
            ], 500);
        }
    }

    public function generateCode()
    {
        try {
            $count = Capacitacion::where('estado', 1)->count() + 1;
            $codigo = 'CAP-' . str_pad($count, 5, '0', STR_PAD_LEFT);
            
            // Verificar que el código no exista
            while (Capacitacion::where('codigo', $codigo)->exists()) {
                $count++;
                $codigo = 'CAP-' . str_pad($count, 5, '0', STR_PAD_LEFT);
            }

            return response()->json([
                'code' => $codigo
            ], 200);

        } catch (\Exception $e) {
            return response()->json([
                'responseCode' => 1,
                'response' => null,
                'msgResultado' => 'Error al generar el código: ' . $e->getMessage()
            ], 500);
        }
    }

    public function listarEstados($domain_id)
    {
        try {
            $estados = DB::table('estados')
                ->select('id', 'nombre', 'color')
                ->where('domain_id', $domain_id)
                ->whereNull('deleted_at')
                ->orderBy('nombre', 'asc')
                ->get();

            return response()->json([
                'responseCode' => 0,
                'response' => $estados,
                'msgResultado' => 'Estados obtenidos correctamente'
            ], 200);

        } catch (\Exception $e) {
            return response()->json([
                'responseCode' => 1,
                'response' => null,
                'msgResultado' => 'Error al obtener los estados: ' . $e->getMessage()
            ], 500);
        }
    }

    public function listarDocentes($domain_id)
    {
        try {
            $docentes = DB::table('docentes')
                ->select('id', 'codigo', 'nombres', 'email')
                ->where('domain_id', $domain_id)
                ->where('estado', 1)
                ->orderBy('nombres', 'asc')
                ->get();

            return response()->json([
                'responseCode' => 0,
                'response' => $docentes,
                'msgResultado' => 'Docentes obtenidos correctamente'
            ], 200);

        } catch (\Exception $e) {
            return response()->json([
                'responseCode' => 1,
                'response' => null,
                'msgResultado' => 'Error al obtener los docentes: ' . $e->getMessage()
            ], 500);
        }
    }

    /**
     * Descargar CV de una capacitación
     */
    public function downloadCV($id)
    {
        try {
            $capacitacion = Capacitacion::find($id);
            
            if (!$capacitacion || $capacitacion->estado == 0) {
                return response()->json([
                    'error' => 'Capacitación no encontrada'
                ], 404);
            }

            if (!$capacitacion->cv_path) {
                return response()->json([
                    'error' => 'No hay CV disponible para esta capacitación'
                ], 404);
            }

            // Construir la ruta completa del archivo
            $filePath = storage_path('app/public/' . $capacitacion->cv_path);

            // Verificar que el archivo existe físicamente
            if (!file_exists($filePath)) {
                return response()->json([
                    'error' => 'Archivo físico no encontrado'
                ], 404);
            }

            $fileName = $capacitacion->cv_original_name ?: 'CV_' . $capacitacion->codigo . '.pdf';

            // Devolver el archivo como descarga
            return response()->download($filePath, $fileName, [
                'Content-Type' => 'application/octet-stream',
            ]);

        } catch (\Exception $e) {
            return response()->json([
                'error' => 'Error al descargar el CV: ' . $e->getMessage()
            ], 500);
        }
    }
}