<?php

namespace App\Observers;

use App\Models\Alumno;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Carbon\Carbon;

class AlumnoObserver
{
    /**
     * Handle the Alumno "created" event.
     */
    public function created(Alumno $alumno)
    {
        Log::info("🎓 Observer: Alumno creado - ID: {$alumno->id}, Ciclo: {$alumno->ciclo_id}, Carrera: {$alumno->carrera_id}");

        // 1️⃣ Inscribir en cursos del ciclo
        $this->inscribirEnCursos($alumno);

        // 2️⃣ Agregar a evaluaciones de esos cursos
        $this->agregarAEvaluaciones($alumno);
    }

    /**
     * Handle the Alumno "updated" event.
     */
    public function updated(Alumno $alumno)
    {
        // Verificar si cambió el ciclo o la carrera
        if ($alumno->isDirty('ciclo_id') || $alumno->isDirty('carrera_id')) {
            Log::info("🔄 Observer: Alumno actualizado - ID: {$alumno->id}, Nuevo Ciclo: {$alumno->ciclo_id}");

            // Re-sincronizar cursos y evaluaciones
            $this->inscribirEnCursos($alumno);
            $this->agregarAEvaluaciones($alumno);
        }
    }

    /**
     * Inscribir alumno en cursos de su ciclo y carrera
     */
    private function inscribirEnCursos(Alumno $alumno)
    {
        try {
            // Obtener cursos del ciclo y carrera del alumno
            $cursos = DB::table('cursos')
                ->where('ciclo_id', $alumno->ciclo_id)
                ->where('carrera_id', $alumno->carrera_id)
                ->where('domain_id', $alumno->domain_id)
                ->whereNull('deleted_at')
                ->pluck('id');

            if ($cursos->isEmpty()) {
                Log::info("⚠️ No hay cursos para Ciclo: {$alumno->ciclo_id}, Carrera: {$alumno->carrera_id}");
                return;
            }

            $now = Carbon::now();

            foreach ($cursos as $cursoId) {
                // Insertar solo si no existe
                DB::table('curso_alumno')->insertOrIgnore([
                    'curso_id' => $cursoId,
                    'alumno_id' => $alumno->id,
                    'domain_id' => $alumno->domain_id,
                    'estado_id' => 2, // EN PROCESO
                    'estado_curso_id' => 2, // EN PROCESO
                    'created_at' => $now,
                    'updated_at' => $now
                ]);
            }

            Log::info("✅ Alumno {$alumno->id} inscrito en {$cursos->count()} cursos");

        } catch (\Exception $e) {
            Log::error("❌ Error inscribiendo en cursos: " . $e->getMessage());
        }
    }

    /**
     * Agregar alumno a evaluaciones de los cursos de su ciclo
     */
    private function agregarAEvaluaciones(Alumno $alumno)
    {
        try {
            // Obtener evaluaciones de cursos del ciclo/carrera del alumno
            $evaluaciones = DB::table('evaluaciones as e')
                ->join('grupo_de_evaluaciones as ge', 'e.grupo_de_evaluaciones_id', '=', 'ge.id')
                ->join('cursos as c', 'ge.curso_id', '=', 'c.id')
                ->where('c.ciclo_id', $alumno->ciclo_id)
                ->where('c.carrera_id', $alumno->carrera_id)
                ->where('c.domain_id', $alumno->domain_id)
                ->whereNull('e.deleted_at')
                ->whereNull('c.deleted_at')
                ->pluck('e.id');

            if ($evaluaciones->isEmpty()) {
                Log::info("⚠️ No hay evaluaciones para este alumno aún");
                return;
            }

            $now = Carbon::now();
            $insertados = 0;

            foreach ($evaluaciones as $evaluacionId) {
                $inserted = DB::table('evaluaciones_alumno')->insertOrIgnore([
                    'evaluacion_id' => $evaluacionId,
                    'alumno_id' => $alumno->id,
                    'nota' => 0,
                    'asistencia' => 0,
                    'created_at' => $now,
                    'updated_at' => $now
                ]);

                if ($inserted) {
                    $insertados++;
                }
            }

            Log::info("✅ Alumno {$alumno->id} agregado a {$insertados} evaluaciones");

        } catch (\Exception $e) {
            Log::error("❌ Error agregando a evaluaciones: " . $e->getMessage());
        }
    }
}