<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Nota;

class NotaController extends Controller
{
    /**
     * @OA\Get(
     *     path="/api/notas",
     *     summary="Lista todas las notas",
     *     tags={"Notas"},
     *     @OA\Response(
     *         response=200,
     *         description="Lista de notas",
     *         @OA\JsonContent(type="array", @OA\Items(ref="#/components/schemas/Nota"))
     *     )
     * )
     */
    public function index()
    {
        try {
            $notas = Nota::with('estudiante')->get();
            return response()->json($notas, 200);
        } catch (\Exception $e) {
            return response()->json([
                'mensaje' => 'Error al obtener las notas',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * @OA\Post(
     *     path="/api/notas",
     *     summary="Crear una nota",
     *     tags={"Notas"},
     *     @OA\RequestBody(
     *         required=true,
     *         @OA\JsonContent(ref="#/components/schemas/Nota")
     *     ),
     *     @OA\Response(
     *         response=201,
     *         description="Nota creada correctamente",
     *         @OA\JsonContent(ref="#/components/schemas/Nota")
     *     ),
     *     @OA\Response(response=422, description="Error de validación")
     * )
     */
    public function store(Request $request)
    {
        try {
            $validated = $request->validate([
                'estudiante_id' => 'required|exists:estudiantes,id',
                'materia' => 'required|string',
                'nota' => 'required|numeric|min:0|max:100',
            ]);

            $nota = Nota::create($validated);
            return response()->json($nota, 201);
        } catch (\Exception $e) {
            return response()->json([
                'mensaje' => 'Error al crear la nota',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * @OA\Get(
     *     path="/api/notas/{id}",
     *     summary="Ver una nota",
     *     tags={"Notas"},
     *     @OA\Parameter(
     *         name="id",
     *         in="path",
     *         required=true,
     *         description="ID de la nota",
     *         @OA\Schema(type="integer")
     *     ),
     *     @OA\Response(
     *         response=200,
     *         description="Detalles de la nota",
     *         @OA\JsonContent(ref="#/components/schemas/Nota")
     *     ),
     *     @OA\Response(response=404, description="No encontrado")
     * )
     */
    public function show($id)
    {
        try {
            $nota = Nota::with('estudiante')->find($id);
            if (!$nota) {
                return response()->json(['mensaje' => 'No encontrado'], 404);
            }
            return response()->json($nota, 200);
        } catch (\Exception $e) {
            return response()->json([
                'mensaje' => 'Error al obtener la nota',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * @OA\Put(
     *     path="/api/notas/{id}",
     *     summary="Actualizar una nota",
     *     tags={"Notas"},
     *     @OA\Parameter(
     *         name="id",
     *         in="path",
     *         required=true,
     *         @OA\Schema(type="integer")
     *     ),
     *     @OA\RequestBody(
     *         required=true,
     *         @OA\JsonContent(ref="#/components/schemas/Nota")
     *     ),
     *     @OA\Response(response=200, description="Nota actualizada correctamente"),
     *     @OA\Response(response=404, description="No encontrado")
     * )
     */
    public function update(Request $request, $id)
    {
        try {
            $nota = Nota::find($id);
            if (!$nota) {
                return response()->json(['mensaje' => 'No encontrado'], 404);
            }

            $validated = $request->validate([
                'estudiante_id' => 'sometimes|exists:estudiantes,id',
                'materia' => 'sometimes|string',
                'nota' => 'sometimes|numeric|min:0|max:100',
            ]);

            $nota->update($validated);
            return response()->json($nota, 200);
        } catch (\Exception $e) {
            return response()->json([
                'mensaje' => 'Error al actualizar la nota',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * @OA\Delete(
     *     path="/api/notas/{id}",
     *     summary="Eliminar una nota",
     *     tags={"Notas"},
     *     @OA\Parameter(
     *         name="id",
     *         in="path",
     *         required=true,
     *         @OA\Schema(type="integer")
     *     ),
     *     @OA\Response(response=200, description="Nota eliminada correctamente"),
     *     @OA\Response(response=404, description="No encontrado")
     * )
     */
    public function destroy($id)
    {
        try {
            $nota = Nota::find($id);
            if (!$nota) {
                return response()->json(['mensaje' => 'No encontrado'], 404);
            }

            $nota->delete();
            return response()->json(['mensaje' => 'Eliminado'], 200);
        } catch (\Exception $e) {
            return response()->json([
                'mensaje' => 'Error al eliminar la nota',
                'error' => $e->getMessage()
            ], 500);
        }
    }
}
