<?php

namespace App\Http\Controllers\Codigo;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

//creados por el usuario
use App\Models\Codigo\CodigoEgresoDetalle;
use App\Models\Codigo\CodigoEgreso;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\DB;
class CodigoEgresoDetalleController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function index()
    {   $id_sede = isset(auth()->user()->id_sede) ? auth()->user()->id_sede : null;

        if (is_null($id_sede) || (int)$id_sede <= 0) {
            abort(403, 'No puede acceder: no tiene una sede asignada.');
        }

        $items = CodigoEgresoDetalle::query()
        ->where('codigo_egreso_detalles.estado', '!=', 'EL')
        ->join('codigo_egresos as ci', 'ci.id', '=', 'codigo_egreso_detalles.id_codigo_egreso')
        ->where('codigo_egreso_detalles.id_sede', $id_sede)
        ->where('ci.id_sede', $id_sede)
        ->where('ci.estado', '!=', 'EL')
        ->select('codigo_egreso_detalles.*') // mantiene el modelo Detalle
        ->with('CodigoEgreso')               // para mostrar padre en la vista
        ->orderBy('ci.codigo', 'asc')         // 1) orden por código del padre
        ->orderBy('codigo_egreso_detalles.codigo', 'asc') // 2) orden por código del detalle
        ->paginate(10);

        return view('Codigo.codigo_egreso_detalle.index', compact('items'));
    }

    /**
     * Show the form for creating a new resource.
     */
    public function create()
    {   $id_sede = auth()->user()->id_sede;

        $codigo_egreso = CodigoEgreso::noEliminados()
            ->where('id_sede', $id_sede)
            ->orderBy('codigo', 'asc')
            ->get();

        return view('Codigo.codigo_egreso_detalle.create', compact('codigo_egreso'));
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(Request $request)
    {   $id_sede=Auth()->user()->id_sede;
        //echo "ID SEDE: $id_sede";

        $data = $request->validate([
            'id_codigo_egreso' => ['required','exists:codigo_egresos,id'],
            'codigo' => [
                'required',
                'string',
                'max:15', // según tu migración (string 15)
                Rule::unique('codigo_egreso_detalles', 'codigo')->where(function ($q) use ($id_sede) {
                    // Unicidad por sede (y opcionalmente ignorando eliminados)
                    return $q->where('id_sede', $id_sede)
                            ->where('estado', '!=', 'EL');
                }),
            ],
            'nombre' => ['required', 'string', 'max:100'],
            'estado' => ['required', 'in:AC,IN'],
        ], [
            'codigo.unique' => 'El código ya existe para esta sede.',
        ]);

      //  $data['nombre'] = mb_strtoupper(trim($data['nombre']), 'UTF-8');
        $data['id_sede'] = $id_sede;

        CodigoEgresoDetalle::create($data);

        return redirect()->route('admin.codigo-egreso-detalle.index')
        ->with('ok', 'Codigo Egreso Detalle creado correctamente.');
    }

    /**
     * Display the specified resource.
     */
    public function show(string $id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     */
    public function edit(CodigoEgresoDetalle $codigo_egreso_detalle)
    {   $id_sede = auth()->user()->id_sede;

        $codigo_egreso = CodigoEgreso::noEliminados()
            ->where('id_sede', $id_sede)
            ->orderBy('codigo', 'asc')
            ->get();
            
        return view('Codigo.codigo_egreso_detalle.edit', ['item' => $codigo_egreso_detalle,'codigo_egreso' => $codigo_egreso,]);
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request, CodigoEgresoDetalle $codigo_egreso_detalle)
    {
        $id_sede = auth()->user()->id_sede;

        // 1) Seguridad: que solo pueda editar registros de su misma sede
        abort_if((int) $codigo_egreso_detalle->id_sede !== (int) $id_sede, 403, 'No autorizado.');

        // 2) Validación: código único por sede (ignorando el propio registro y opcionalmente EL)
        $data = $request->validate([
            'codigo' => [
                'required',
                'string',
                'max:15',
                Rule::unique('codigo_egreso_detalles', 'codigo')
                    ->ignore($codigo_egreso_detalle->id)
                    ->where(function ($q) use ($id_sede) {
                        return $q->where('id_sede', $id_sede)
                                ->where('estado', '!=', 'EL');
                    }),
            ],
            'nombre' => ['required', 'string', 'max:100'],
            'estado' => ['required', 'in:AC,IN'],
        ], [
            'codigo.unique' => 'Ya existe ese código en esta sede.',
        ]);

        $data['codigo'] = trim($data['codigo']);
        //$data['nombre'] = mb_strtoupper(trim($data['nombre']), 'UTF-8');

        $codigo_egreso_detalle->update($data);

        return redirect()->route('admin.codigo-egreso-detalle.index')
            ->with('ok', 'Código Egreso actualizado correctamente.');
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(CodigoEgresoDetalle $codigo_egreso_detalle)
    {
        // Eliminación lógica
        $codigo_egreso_detalle->update(['estado' => 'EL']);

        return redirect()->route('admin.codigo-egreso-detalle.index')
            ->with('ok', 'Código Egreso Detalle eliminado (lógico) correctamente.');
    }

    public function ajaxCodigoEgresoDetalle($id_codigo_egreso, $id_sede)
    {
        $data = DB::table('codigo_egreso_detalles')
            ->select('id', 'codigo', 'nombre')
            ->where('id_codigo_egreso', $id_codigo_egreso)
            ->where('id_sede', $id_sede)
            ->where('estado', '<>', 'EL')
            ->orderBy('codigo', 'asc')
            ->get();

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