<?php

namespace App\Http\Controllers;

use App\Models\Alumno;
use App\Models\Campan;
use App\Models\Entrega;
use App\Models\Tarea;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;

class EntregaController extends Controller
{
    public function index()
    {
        $alumno = Alumno::whereHas('alumnos', fn($q) => $q->where('id', Auth::id()))->first();

        if (!$alumno) {
            return view('tarea.mis_tareas', [
                'tareasPendientes' => collect(),
                'tareasEntregadas' => collect(),
                'entregasMap'      => collect(),
                'cicloActual'      => null,
            ]);
        }

        // Ciclo más alto del alumno = semestre en curso
        $maxCiclo = DB::table('alumno_grupo')
            ->join('grupos', 'grupos.id', '=', 'alumno_grupo.grupo_id')
            ->where('alumno_grupo.alumno_id', $alumno->id)
            ->max('grupos.ciclo');

        // Campan para mostrar el nombre en la vista (busca por id = ciclo, o cae al activo)
        $cicloActual = $maxCiclo ? Campan::find($maxCiclo) ?? Campan::where('status', 1)->first() : null;

        // Grupos del alumno en ese ciclo
        $gruposActuales = $maxCiclo
            ? DB::table('alumno_grupo')
                ->join('grupos', 'grupos.id', '=', 'alumno_grupo.grupo_id')
                ->where('alumno_grupo.alumno_id', $alumno->id)
                ->where('grupos.ciclo', $maxCiclo)
                ->pluck('alumno_grupo.grupo_id')
            : collect();

        $todasTareas = Tarea::whereIn('grupo_id', $gruposActuales)
            ->with(['material', 'grupo'])
            ->orderByDesc('created_at')
            ->get();

        $entregasMap = Entrega::where('alumno_id', $alumno->id)
            ->whereIn('tarea_id', $todasTareas->pluck('id'))
            ->get()
            ->keyBy('tarea_id');

        // Separar: sin_subir = pendientes de entregar | pendiente/calificada = ya entregadas
        $tareasPendientes = $todasTareas->filter(
            fn($t) => ($entregasMap[$t->id]->status ?? 'sin_subir') === 'sin_subir'
        );

        $tareasEntregadas = $todasTareas->filter(
            fn($t) => in_array($entregasMap[$t->id]->status ?? 'sin_subir', ['pendiente', 'calificada'])
        );

        return view('tarea.mis_tareas', compact(
            'tareasPendientes', 'tareasEntregadas', 'entregasMap', 'alumno', 'cicloActual'
        ));
    }

    public function store(Request $request, Tarea $tarea)
    {
        $request->validate([
            'archivo' => 'nullable|file|max:20480',
            'texto'   => 'nullable|string|max:5000',
        ]);

        if (!$request->hasFile('archivo') && !filled($request->texto)) {
            return redirect()->route('mis.tareas')
                ->withErrors(['entrega' => 'Debes escribir un texto o adjuntar un archivo.']);
        }

        $alumno = Alumno::whereHas('alumnos', fn($q) => $q->where('id', Auth::id()))->first();

        if (!$alumno) {
            return redirect()->route('mis.tareas')
                ->with('error', 'No se encontró un perfil de alumno para tu cuenta.');
        }

        $entrega = Entrega::where('tarea_id', $tarea->id)
            ->where('alumno_id', $alumno->id)
            ->first();

        if (!$entrega) {
            $entrega = Entrega::create([
                'tarea_id'  => $tarea->id,
                'alumno_id' => $alumno->id,
                'status'    => 'sin_subir',
            ]);
        }

        if ($entrega->status !== 'sin_subir') {
            return redirect()->route('mis.tareas')
                ->with('error', 'Ya entregaste esta tarea y no puedes volver a subirla.');
        }

        $path = $entrega->archivo;
        if ($request->hasFile('archivo')) {
            $path = $request->file('archivo')->store("entregas/{$tarea->id}");
        }

        $entrega->update([
            'archivo' => $path,
            'texto'   => $request->texto,
            'status'  => 'pendiente',
        ]);

        return redirect()->route('mis.tareas')
            ->with('info', 'Tarea enviada correctamente. Queda pendiente de calificación.');
    }
}
