<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Validator;
use App\Models\Lectura;
use Illuminate\Http\Request;

class LecturaController extends Controller
{
    public function index(Request $request)
    {
        $term = $request->input('term');

        $query = Lectura::with('preguntas.opciones');

        if ($term) {
            $query->where(function ($q) use ($term) {
                $q->where('titulo', 'LIKE', "%$term%")
                  ->orWhere('nivel', 'LIKE', "%$term%");
            });
        }

        return response()->json($query->latest()->get(), 200);
    }

    public function show($id)
    {
        $lectura = Lectura::with('preguntas.opciones')->find($id);

        if (!$lectura) {
            return response()->json(['message' => 'Lectura no encontrada.'], 404);
        }

        return response()->json($lectura, 200);
    }

    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'titulo' => 'required|string|max:150',
            'contenido' => 'required|string',
            'nivel' => 'nullable|string|max:50',
            'grado_sugerido' => 'nullable|integer|min:1|max:12',
            'cantidad_palabras' => 'nullable|integer|min:1',
        ]);

        if ($validator->fails()) {
            return response()->json([
                'message' => 'Revise los datos ingresados.',
                'errors' => $validator->errors()
            ], 422);
        }

        $lectura = Lectura::create([
            'titulo' => $request->titulo,
            'contenido' => $request->contenido,
            'nivel' => $request->nivel,
            'grado_sugerido' => $request->grado_sugerido,
            'cantidad_palabras' => $request->cantidad_palabras ?? str_word_count(strip_tags($request->contenido)),
            'estado' => true,
        ]);

        return response()->json([
            'message' => 'Lectura registrada correctamente.',
            'success' => true,
            'element' => $lectura
        ], 201);
    }

    public function update(Request $request, $id)
    {
        $lectura = Lectura::find($id);

        if (!$lectura) {
            return response()->json(['message' => 'Lectura no encontrada.'], 404);
        }

        $validator = Validator::make($request->all(), [
            'titulo' => 'required|string|max:150',
            'contenido' => 'required|string',
            'nivel' => 'nullable|string|max:50',
            'grado_sugerido' => 'nullable|integer|min:1|max:12',
            'cantidad_palabras' => 'nullable|integer|min:1',
        ]);

        if ($validator->fails()) {
            return response()->json([
                'message' => 'Revise los datos ingresados.',
                'errors' => $validator->errors()
            ], 422);
        }

        $lectura->update([
            'titulo' => $request->titulo,
            'contenido' => $request->contenido,
            'nivel' => $request->nivel,
            'grado_sugerido' => $request->grado_sugerido,
            'cantidad_palabras' => $request->cantidad_palabras ?? str_word_count(strip_tags($request->contenido)),
        ]);

        return response()->json([
            'message' => 'Lectura actualizada correctamente.',
            'success' => true,
            'element' => $lectura
        ], 200);
    }

    public function destroy($id)
    {
        $lectura = Lectura::find($id);

        if (!$lectura) {
            return response()->json(['message' => 'Lectura no encontrada.'], 404);
        }

        $lectura->delete();

        return response()->json([
            'message' => 'Lectura eliminada correctamente.',
            'success' => true
        ], 200);
    }

    public function habilitar($id)
    {
        $item = Lectura::find($id);

        if (!$item) {
            return response()->json([
                'message' => 'Lectura no encontrada.'
            ], 404);
        }

        $item->estado = !$item->estado;
        $item->save();

        $text = $item->estado ? 'habilitado' : 'deshabilitado';

        return response()->json([
            'message' => 'Material ' . $text . ' correctamente.',
            'success' => true
        ], 200);
    }
}
