<?php

namespace App\Http\Controllers\Caja;

use App\Http\Controllers\Controller;
use App\Models\Caja\Movimientos;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class SalidaAnularController extends Controller
{
    public function index()
    {
        $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 = DB::table('movimientos')
            ->select('id', 'serie', 'numero', 'codigo', 'estado', 'motivo_anulacion', 'fecha_movimiento')
            ->where('id_sede', $id_sede)
            ->where('tipo_movimiento', 2)
            ->where('estado', 'BA')
            ->orderBy('fecha_movimiento', 'desc')
            ->orderBy('serie', 'asc')
            ->orderBy('numero', 'asc')
            ->get();

        return view('Caja.salida_anular.index', compact('items'));
    }

    public function create()
    {
        return redirect()->route('admin.salida-anular.index');
    }

    public function store(Request $request)
    {
        abort(405);
    }

    public function show(string $id)
    {
        return redirect()->route('admin.salida-anular.edit', $id);
    }

    public function edit(string $id)
    {
        $item = $this->buscarEgresoPendiente($id);

        abort_if(!$item, 404, 'Movimiento no encontrado o ya no esta pendiente de anulacion.');

        return view('Caja.salida_anular.edit', compact('item'));
    }

    public function update(Request $request, string $id)
    {
        $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.');
        }

        $movimiento = Movimientos::query()
            ->where('id', $id)
            ->where('id_sede', $id_sede)
            ->where('tipo_movimiento', 2)
            ->where('estado', 'BA')
            ->first();

        abort_if(!$movimiento, 404, 'Movimiento no encontrado o ya no esta pendiente de anulacion.');

        $movimiento->update([
            'estado' => 'AN',
        ]);

        return redirect()->route('admin.salida-anular.index')
            ->with('success', 'Egreso anulado correctamente.');
    }

    public function destroy(string $id)
    {
        abort(405);
    }

    private function buscarEgresoPendiente($id)
    {
        $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.');
        }

        return DB::table('movimientos as m')
            ->leftJoin('clientes as c', 'c.id', '=', 'm.id_cliente')
            ->leftJoin('proyectos as p', 'p.id', '=', 'm.id_proyecto')
            ->leftJoin('codigo_egresos as ce', 'ce.id', '=', 'm.id_codigoingreso')
            ->leftJoin('codigo_egreso_detalles as ced', 'ced.id', '=', 'm.id_codigoingresodetalle')
            ->select(
                'm.*',
                'c.dni as cliente_dni',
                'c.nombres as cliente_nombres',
                'c.apellido_paterno as cliente_apellido_paterno',
                'c.apellido_materno as cliente_apellido_materno',
                'p.codigo as proyecto_codigo',
                'p.nombre as proyecto_nombre',
                'ce.codigo as codigo_egreso_codigo',
                'ce.nombre as codigo_egreso_nombre',
                'ced.codigo as codigo_egreso_detalle_codigo',
                'ced.nombre as codigo_egreso_detalle_nombre'
            )
            ->where('m.id', $id)
            ->where('m.id_sede', $id_sede)
            ->where('m.tipo_movimiento', 2)
            ->where('m.estado', 'BA')
            ->first();
    }
}
