<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

/**
 * Controlador genérico para catálogos sencillos (codigo, nombre, etc.).
 * Configurable por slug → tabla.
 */
class CatalogoSimpleController extends Controller
{
    private array $catalogos = [
        'tipos-mantenimiento' => [
            'tabla' => 'tipos_mantenimiento',
            'titulo' => 'Tipos de mantenimiento',
            'campos' => [
                ['codigo','Código','text',true,20],
                ['nombre','Nombre','text',true,100],
                ['clase','Clase','select',true,20,['preventivo','correctivo','predictivo','otro']],
                ['descripcion','Descripción','textarea',false],
                ['activo','Activo','bool',false],
            ],
            'permiso' => 'catalogos.gestionar',
        ],
        'frecuencias' => [
            'tabla' => 'frecuencias',
            'titulo' => 'Frecuencias',
            'campos' => [
                ['codigo','Código','text',true,20],
                ['nombre','Nombre','text',true,80],
                ['dias','Días equivalentes','number',false],
                ['horas_pm','Horas PM equivalentes','number',false],
                ['activo','Activo','bool',false],
            ],
            'permiso' => 'catalogos.gestionar',
        ],
        'unidades' => [
            'tabla' => 'unidades',
            'titulo' => 'Unidades de medida',
            'campos' => [
                ['codigo','Código','text',true,20],
                ['nombre','Nombre','text',true,80],
                ['activo','Activo','bool',false],
            ],
            'permiso' => 'catalogos.gestionar',
        ],
        'estados-orden' => [
            'tabla' => 'estados_orden',
            'titulo' => 'Estados de orden',
            'campos' => [
                ['codigo','Código','text',true,20],
                ['nombre','Nombre','text',true,60],
                ['color','Color','color',false],
                ['orden','Orden','number',false],
                ['cierra_orden','Cierra orden','bool',false],
                ['activo','Activo','bool',false],
            ],
            'permiso' => 'catalogos.gestionar',
        ],
        'prioridades' => [
            'tabla' => 'prioridades',
            'titulo' => 'Prioridades',
            'campos' => [
                ['codigo','Código','text',true,20],
                ['nombre','Nombre','text',true,60],
                ['color','Color','color',false],
                ['nivel','Nivel','number',false],
                ['activo','Activo','bool',false],
            ],
            'permiso' => 'catalogos.gestionar',
        ],
        'actividades-lila' => [
            'tabla' => 'actividades_lila',
            'titulo' => 'Actividades LILA',
            'campos' => [
                ['codigo','Código','text',true,10],
                ['nombre','Nombre','text',true,80],
                ['icono','Icono FA','text',false,30],
                ['activo','Activo','bool',false],
            ],
            'permiso' => 'catalogos.gestionar',
        ],
    ];

    private function meta(string $slug): array
    {
        abort_unless(isset($this->catalogos[$slug]), 404);
        return $this->catalogos[$slug];
    }

    public function index(Request $r, string $slug)
    {
        $meta = $this->meta($slug);
        $busqueda = trim((string) $r->get('q', ''));
        $q = DB::table($meta['tabla']);
        if ($busqueda !== '') {
            $q->where(function($w) use ($busqueda) {
                $w->where('codigo','like',"%{$busqueda}%")->orWhere('nombre','like',"%{$busqueda}%");
            });
        }
        $registros = $q->orderBy('codigo')->paginate(25)->withQueryString();
        return view('catalogos.simple_index', compact('meta','slug','registros','busqueda'));
    }

    public function create(string $slug)
    {
        $meta = $this->meta($slug);
        $registro = (object) array_fill_keys(array_column($meta['campos'], 0), null);
        $registro->activo = true;
        return view('catalogos.simple_form', compact('meta','slug','registro'));
    }

    public function store(Request $r, string $slug)
    {
        $meta = $this->meta($slug);
        $datos = $this->validar($r, $meta);
        $datos['created_at'] = now();
        $datos['updated_at'] = now();
        DB::table($meta['tabla'])->insert($datos);
        return redirect()->route('catalogos.index', $slug)->with('exito', 'Registro creado.');
    }

    public function edit(string $slug, int $id)
    {
        $meta = $this->meta($slug);
        $registro = DB::table($meta['tabla'])->where('id', $id)->first();
        abort_unless($registro, 404);
        return view('catalogos.simple_form', compact('meta','slug','registro'));
    }

    public function update(Request $r, string $slug, int $id)
    {
        $meta = $this->meta($slug);
        $datos = $this->validar($r, $meta, $id);
        $datos['updated_at'] = now();
        DB::table($meta['tabla'])->where('id', $id)->update($datos);
        return redirect()->route('catalogos.index', $slug)->with('exito', 'Registro actualizado.');
    }

    public function destroy(string $slug, int $id)
    {
        $meta = $this->meta($slug);
        try {
            DB::table($meta['tabla'])->where('id', $id)->delete();
            return back()->with('exito', 'Registro eliminado.');
        } catch (\Throwable $e) {
            return back()->with('error', 'No se puede eliminar: registro en uso.');
        }
    }

    private function validar(Request $r, array $meta, ?int $id = null): array
    {
        $reglas = [];
        $datos = [];
        foreach ($meta['campos'] as $c) {
            [$nombre, $label, $tipo] = $c;
            $req = $c[3] ?? false;
            $max = $c[4] ?? null;
            $rule = [];
            if ($tipo === 'bool') { $datos[$nombre] = $r->boolean($nombre); continue; }
            if ($req) $rule[] = 'required';
            else $rule[] = 'nullable';
            if ($tipo === 'number') $rule[] = 'numeric';
            if ($tipo === 'text' || $tipo === 'textarea' || $tipo === 'select' || $tipo === 'color') {
                $rule[] = 'string';
                if ($max) $rule[] = "max:{$max}";
            }
            if ($nombre === 'codigo') {
                $unique = "unique:{$meta['tabla']},codigo" . ($id ? ",{$id}" : '');
                $rule[] = $unique;
            }
            $reglas[$nombre] = $rule;
            $datos[$nombre] = $r->input($nombre);
        }
        $r->validate($reglas);
        return $datos;
    }
}
