<?php

namespace App\Http\Controllers\Administracion;

use App\Http\Controllers\Controller;

use App\Models\Proceso;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;

class ProcesoController extends Controller
{
  
    public function index(Request $request)
    {
        $query = Proceso::query();

        if ($request->filled('search')) {
            $query->where('nombre', 'like', '%' . $request->search . '%');
        }

        if ($request->filled('activo')) {
            $query->where('activo', $request->boolean('activo'));
        }

        if ($request->filled('publico')) {
            $query->where('publico', $request->boolean('publico'));
        }

        if ($request->filled('tipo_proceso')) {
            $query->where('tipo_proceso', $request->tipo_proceso);
        }

        $procesos = $query
            ->orderBy('created_at', 'desc')
            ->paginate($request->get('per_page', 10));

        return response()->json($procesos);
    }

    public function store(Request $request)
    {
        $data = $request->validate([
            'nombre'              => 'required|string|max:255',
            'descripcion'         => 'nullable|string',
            'estado'              => 'nullable|string|max:50',

            'duracion'            => 'nullable|integer|min:1',
            'intentos_maximos'    => 'nullable|integer|min:1',

            'requiere_pago'       => 'boolean',
            'precio'              => 'nullable|numeric|min:0',
            'calificacion_id'     => 'nullable|exists:calificaciones,id',

            'tipo_simulacro'      => 'nullable|string|max:50',
            'tipo_proceso'        => 'nullable|string|max:50',

            'activo'              => 'boolean',
            'publico'             => 'boolean',

            'fecha_inicio'        => 'nullable|date',
            'fecha_fin'           => 'nullable|date|after_or_equal:fecha_inicio',
            'tiempo_por_pregunta' => 'nullable|integer|min:1',
        ]);

        $data['slug'] = Str::slug($data['nombre']) . '-' . uniqid();

        $proceso = Proceso::create($data);

        return response()->json([
            'message' => 'Proceso creado correctamente',
            'data'    => $proceso
        ], 201);
    }

    public function show($id)
    {
        $proceso = Proceso::findOrFail($id);

        return response()->json($proceso);
    }


    public function update(Request $request, $id)
    {
        $proceso = Proceso::findOrFail($id);

        $data = $request->validate([
            'nombre'              => 'required|string|max:255',
            'descripcion'         => 'nullable|string',
            'estado'              => 'nullable|string|max:50',

            'duracion'            => 'nullable|integer|min:1',
            'intentos_maximos'    => 'nullable|integer|min:1',

            'requiere_pago'       => 'boolean',
            'precio'              => 'nullable|numeric|min:0',
            'calificacion_id'     => 'nullable|exists:calificaciones,id',

            'tipo_simulacro'      => 'nullable|string|max:50',
            'tipo_proceso'        => 'nullable|string|max:50',

            'activo'              => 'boolean',
            'publico'             => 'boolean',

            'fecha_inicio'        => 'nullable|date',
            'fecha_fin'           => 'nullable|date|after_or_equal:fecha_inicio',
            'tiempo_por_pregunta' => 'nullable|integer|min:1',
        ]);

        if ($data['nombre'] !== $proceso->nombre) {
            $data['slug'] = Str::slug($data['nombre']) . '-' . uniqid();
        }

        $proceso->update($data);

        return response()->json([
            'message' => 'Proceso actualizado correctamente',
            'data'    => $proceso
        ]);
    }


    public function destroy($id)
    {
        $proceso = Proceso::findOrFail($id);
        $proceso->delete();

        return response()->json([
            'message' => 'Proceso eliminado correctamente'
        ]);
    }


    public function toggleActivo($id)
    {
        $proceso = Proceso::findOrFail($id);
        $proceso->activo = !$proceso->activo;
        $proceso->save();

        return response()->json([
            'message' => 'Estado actualizado',
            'activo'  => $proceso->activo
        ]);
    }
}
