<?php

namespace App\Http\Controllers;

use App\Models\Integrante;
use App\Models\Capacitacion;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;

class IntegranteController extends Controller
{
    /**
     * Listar todos los integrantes de una capacitación
     */
    public function index($capacitacion_id)
    {
        try {
            $integrantes = Integrante::where('capacitacion_id', $capacitacion_id)
                ->where('estado', 1)
                ->get();

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

    /**
     * Crear un nuevo integrante para una capacitación
     */
    public function store(Request $request, $capacitacion_id)
    {
        try {
            $capacitacion = Capacitacion::findOrFail($capacitacion_id);

            $rules = [
                'nombre_completo' => 'required|string|max:255|min:3',
                'email' => 'required|email|max:191',
                'telefono' => 'required|string|max:15|min:9',
                'documento_identidad' => [
                    'required',
                    'string',
                    'max:20',
                    'min:8',
                    Rule::unique('integrantes')->where(function ($query) use ($capacitacion_id) {
                        return $query->where('capacitacion_id', $capacitacion_id);
                    })
                ],
                'fecha_inscripcion' => 'required|date',
            ];

            $messages = [
                'nombre_completo.required' => 'El nombre completo es requerido',
                'nombre_completo.min' => 'El nombre completo debe tener al menos 3 caracteres',
                'email.required' => 'El email es requerido',
                'email.email' => 'El email debe ser válido',
                'telefono.required' => 'El teléfono es requerido',
                'telefono.min' => 'El teléfono debe tener al menos 9 dígitos',
                'documento_identidad.required' => 'El documento de identidad es requerido',
                'documento_identidad.unique' => 'Ya existe un integrante con este documento de identidad en esta capacitación',
                'documento_identidad.min' => 'El documento debe tener al menos 8 caracteres',
                'fecha_inscripcion.required' => 'La fecha de inscripción es requerida',
                'fecha_inscripcion.date' => 'La fecha de inscripción debe ser una fecha válida',
            ];

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

            $integrante = Integrante::create([
                'capacitacion_id' => $capacitacion_id,
                'nombre_completo' => $request->nombre_completo,
                'email' => $request->email,
                'telefono' => $request->telefono,
                'documento_identidad' => $request->documento_identidad,
                'fecha_inscripcion' => $request->fecha_inscripcion,
                'estado' => 1,
            ]);

            return response()->json([
                'responseCode' => 0,
                'response' => $integrante,
                'msgResultado' => 'Integrante creado 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 el integrante: ' . $e->getMessage()
            ], 500);
        }
    }

    /**
     * Mostrar un integrante específico
     */
    public function show($capacitacion_id, $id)
    {
        try {
            $integrante = Integrante::where('capacitacion_id', $capacitacion_id)
                ->where('id', $id)
                ->where('estado', 1)
                ->first();

            if (!$integrante) {
                return response()->json([
                    'responseCode' => 1,
                    'response' => null,
                    'msgResultado' => 'Integrante no encontrado'
                ], 404);
            }

            return response()->json([
                'responseCode' => 0,
                'response' => $integrante,
                'msgResultado' => 'Integrante obtenido correctamente'
            ], 200);
        } catch (\Exception $e) {
            return response()->json([
                'responseCode' => 1,
                'response' => null,
                'msgResultado' => 'Error al obtener el integrante: ' . $e->getMessage()
            ], 500);
        }
    }

    /**
     * Actualizar un integrante existente
     */
    public function update(Request $request, $capacitacion_id, $id)
    {
        try {
            $integrante = Integrante::where('capacitacion_id', $capacitacion_id)
                ->where('id', $id)
                ->where('estado', 1)
                ->first();

            if (!$integrante) {
                return response()->json([
                    'responseCode' => 1,
                    'response' => null,
                    'msgResultado' => 'Integrante no encontrado'
                ], 404);
            }

            $rules = [
                'nombre_completo' => 'required|string|max:255|min:3',
                'email' => 'required|email|max:191',
                'telefono' => 'required|string|max:15|min:9',
                'documento_identidad' => [
                    'required',
                    'string',
                    'max:20',
                    'min:8',
                    Rule::unique('integrantes')->ignore($id)->where(function ($query) use ($capacitacion_id) {
                        return $query->where('capacitacion_id', $capacitacion_id);
                    })
                ],
                'fecha_inscripcion' => 'required|date',
            ];

            $messages = [
                'nombre_completo.required' => 'El nombre completo es requerido',
                'nombre_completo.min' => 'El nombre completo debe tener al menos 3 caracteres',
                'email.required' => 'El email es requerido',
                'email.email' => 'El email debe ser válido',
                'telefono.required' => 'El teléfono es requerido',
                'telefono.min' => 'El teléfono debe tener al menos 9 dígitos',
                'documento_identidad.required' => 'El documento de identidad es requerido',
                'documento_identidad.unique' => 'Ya existe un integrante con este documento de identidad en esta capacitación',
                'documento_identidad.min' => 'El documento debe tener al menos 8 caracteres',
                'fecha_inscripcion.required' => 'La fecha de inscripción es requerida',
                'fecha_inscripcion.date' => 'La fecha de inscripción debe ser una fecha válida',
            ];

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

            $integrante->update([
                'nombre_completo' => $request->nombre_completo,
                'email' => $request->email,
                'telefono' => $request->telefono,
                'documento_identidad' => $request->documento_identidad,
                'fecha_inscripcion' => $request->fecha_inscripcion,
            ]);

            return response()->json([
                'responseCode' => 0,
                'response' => $integrante,
                'msgResultado' => 'Integrante actualizado 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 el integrante: ' . $e->getMessage()
            ], 500);
        }
    }

    /**
     * Eliminar un integrante (eliminación lógica)
     */
    public function destroy($capacitacion_id, $id)
    {
        try {
            $integrante = Integrante::where('capacitacion_id', $capacitacion_id)
                ->where('id', $id)
                ->where('estado', 1)
                ->first();

            if (!$integrante) {
                return response()->json([
                    'responseCode' => 1,
                    'response' => null,
                    'msgResultado' => 'Integrante no encontrado'
                ], 404);
            }

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

            return response()->json([
                'responseCode' => 0,
                'response' => $integrante,
                'msgResultado' => 'Integrante eliminado correctamente'
            ], 200);
        } catch (\Exception $e) {
            return response()->json([
                'responseCode' => 1,
                'response' => null,
                'msgResultado' => 'Error al eliminar el integrante: ' . $e->getMessage()
            ], 500);
        }
    }
}