<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Helpers\FechaHelper;
use App\Helpers\SeguimientoHelper;

/**
 * NotaController — Notas de Entrega de Documentos
 *
 * Archivos PHP migrados:
 *   index.php       → index()
 *   rejilla.php     → index() con paginación
 *   nueva_nota.php  → create()
 *   guardar_nota.php → store()
 *   ver_nota.php    → show()
 *   anular_nota.php → anular()
 *
 * Tabla: notas
 * Lotes elegibles: iteest=5 (En Trámite — tienen autorización activa)
 *
 * Los checkboxes (tramite, transferencia, protocolo, planolote, visado, minuta, ddrr)
 * marcan qué documentos se entregan. Al guardar se registra el idnota en la tabla
 * correspondiente del trámite (tramites, transferencias, protocolos, etc.)
 * Si un checkbox ya tiene idnota != 0 → viene deshabilitado (ya entregado antes).
 */
class NotaController extends Controller
{
    // Los 7 documentos de trámite que puede incluir una nota
    const TRAMITE_ITEMS = [
        'tramite'      => ['tabla' => 'tramites',       'label' => 'Elaboración de Minuta'],
        'transferencia'=> ['tabla' => 'transferencias',  'label' => 'Pago de Impuestos a la Transferencia'],
        'protocolo'    => ['tabla' => 'protocolos',      'label' => 'Elaboración de Protocolo'],
        'planolote'    => ['tabla' => 'planoslotes',     'label' => 'Plano de Lote'],
        'visado'       => ['tabla' => 'visados',         'label' => 'Visado de Lote'],
        'minuta'       => ['tabla' => 'minutas',         'label' => 'Elaboración de Minuta de Datos Técnicos'],
        'ddrr'         => ['tabla' => 'derechosreales',  'label' => 'Ingreso a Derechos Reales'],
    ];

    public function __construct()
    {
        $this->middleware('auth');
    }

    // ── Listado ──────────────────────────────────────────────────────────────
    public function index(Request $request)
    {
        $buscar  = $request->input('buscar', '');
        $buscax  = $request->input('buscax', 'nota'); // nota|contrato|cliente|lote

        $query = DB::table('notas')
            ->leftJoin('clientes', 'notas.idcliente', '=', 'clientes.id')
            ->where('notas.anul', 0)
            ->select('notas.*', 'clientes.nombre as nom_cliente');

        if ($buscar !== '') {
            $idlote = null;

            if ($buscax === 'contrato') {
                $idlote = DB::table('contratos')
                    ->where('id', $buscar)->where('anul', 0)->value('idlote');
                if ($idlote) $query->where('notas.idlote', $idlote);
                else $query->whereRaw('1=0'); // sin resultados
            } elseif ($buscax === 'cliente') {
                $query->where('notas.idcliente', $buscar);
            } elseif ($buscax === 'lote') {
                $query->where('notas.idlote', $buscar);
            } else {
                $query->where('notas.id', $buscar);
            }
        }

        $notas = $query->orderBy('notas.id')->paginate(50)->withQueryString();

        return view('notas.index', compact('notas', 'buscar', 'buscax'));
    }

    // ── Ver detalle ──────────────────────────────────────────────────────────
    public function show(int $id)
    {
        $nota = DB::table('notas')->where('id', $id)->first();
        if (!$nota) abort(404);

        $cliente = DB::table('clientes')->where('id', $nota->idcliente)->first();
        $urb     = DB::table('urbanizaciones')->where('id', $nota->urbanizacion)->first();
        $dis     = DB::table('distritos')->where('id', $nota->distrito)->first();

        return view('notas.show', compact('nota', 'cliente', 'urb', 'dis'));
    }

    // ── Formulario nuevo ─────────────────────────────────────────────────────
    public function create()
    {
        $this->soloAdminOTecnico();

        $nuevoId        = (DB::table('notas')->max('id') ?? 0) + 1;
        $hoy            = FechaHelper::hoy();
        $urbanizaciones = DB::table('urbanizaciones')->orderBy('id')->get();

        return view('notas.create', compact('nuevoId', 'hoy', 'urbanizaciones'));
    }

    // ── AJAX: lotes En Trámite (iteest=5) con tramite activo ─────────────────
    public function getLotesEnTramite(int $idDistrito)
    {
        $lotes = DB::table('lotes')
            ->join('tramites', 'lotes.id', '=', 'tramites.idlote')
            ->where('lotes.relacion', $idDistrito)
            ->where('lotes.iteest', 5)
            ->where('tramites.anul', 0)
            ->select('lotes.id', 'lotes.manzano', 'lotes.nombre', 'lotes.superf')
            ->get();

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

    // ── AJAX: datos del lote → cliente + estado de cada tramite ──────────────
    // Equivale a ver_distritos_lotes.php select4
    public function getDatosLote(int $idlote)
    {
        // Contrato y cliente
        $contrato = DB::table('contratos')
            ->where('idlote', $idlote)
            ->first(['id as idcontrato', 'idcliente']);

        $nombreCliente = '';
        if ($contrato) {
            $nombreCliente = DB::table('clientes')
                ->where('id', $contrato->idcliente)->value('nombre') ?? '';
        }

        // ID del trámite activo para este lote
        $idtramite = null;
        if ($contrato) {
            $idtramite = DB::table('tramites')
                ->where('idlote', $idlote)
                ->where('idcontrato', $contrato->idcontrato)
                ->where('idcliente', $contrato->idcliente)
                ->value('id');
        }

        // Estado de cada documento (idnota != 0 → ya entregado = disabled)
        $estado = [];
        foreach (self::TRAMITE_ITEMS as $campo => $info) {
            $idnota = 0;
            if ($idtramite) {
                try {
                    $idnota = DB::table($info['tabla'])
                        ->where('id', $idtramite)
                        ->value('idnota') ?? 0;
                } catch (\Exception $e) {
                    $idnota = 0;
                }
            }
            $estado[$campo] = [
                'label'    => $info['label'],
                'entregado'=> (int)$idnota !== 0, // true = ya tiene nota, deshabilitar
            ];
        }

        return response()->json([
            'idcontrato'     => $contrato->idcontrato ?? null,
            'idcliente'      => $contrato->idcliente  ?? null,
            'nombre_cliente' => $nombreCliente,
            'idtramite'      => $idtramite,
            'estado'         => $estado,
        ]);
    }

    // ── Guardar nota ─────────────────────────────────────────────────────────
    public function store(Request $request)
    {
        $this->soloAdminOTecnico();

        $request->validate([
            'id'            => 'required|integer|unique:notas,id',
            'select1'       => 'required|integer|not_in:0',
            'select2'       => 'required|integer|not_in:0',
            'select3'       => 'required|integer|not_in:0',
            'entregado'     => 'required|string|min:3|max:80',
            'observaciones' => 'required|string|min:3|max:200',
        ], [
            'id.unique'           => 'Esta nota de entrega ya existe.',
            'select1.not_in'      => 'Seleccione urbanización.',
            'select2.not_in'      => 'Seleccione distrito.',
            'select3.not_in'      => 'Seleccione lote.',
            'entregado.required'  => 'Ingrese el nombre del responsable.',
        ]);

        $id        = (int) $request->id;
        $idlote    = (int) $request->select3;
        $idcliente = (int) $request->idcliente;
        $fecha     = FechaHelper::localToBd($request->fecha);

        // Obtener manzano/lote del lote seleccionado
        $lote = DB::table('lotes')->where('id', $idlote)->first();

        // Cuáles checkboxes marcó el usuario
        $items = [];
        foreach (self::TRAMITE_ITEMS as $campo => $info) {
            $items[$campo] = $request->has($campo) ? 1 : 0;
        }

        // Validar que al menos uno esté marcado
        if (array_sum($items) === 0) {
            return back()->with('error', 'Marque al menos un trámite para la nota de entrega.')
                         ->withInput();
        }

        // ── 1. Insertar en notas ─────────────────────────────────────────────
        DB::table('notas')->insert([
            'id'            => $id,
            'movtip'        => 2,
            'urbanizacion'  => $request->select1,
            'distrito'      => $request->select2,
            'idlote'        => $idlote,
            'manzano'       => $lote->manzano ?? '',
            'lote'          => $lote->nombre  ?? '',
            'fecha'         => $fecha,
            'idcliente'     => $idcliente,
            'entregado'     => $request->entregado,
            'observaciones' => $request->observaciones,
            'tramite'       => $items['tramite'],
            'transferencia' => $items['transferencia'],
            'protocolo'     => $items['protocolo'],
            'planolote'     => $items['planolote'],
            'visado'        => $items['visado'],
            'minuta'        => $items['minuta'],
            'ddrr'          => $items['ddrr'],
            'anul'          => 0,
        ]);

        // ── 2. Obtener ID del trámite ────────────────────────────────────────
        $idtramite = DB::table('tramites')->where('idlote', $idlote)->value('id');

        // ── 3. Registrar idnota en cada tabla de trámite ─────────────────────
        if ($idtramite) {
            foreach (self::TRAMITE_ITEMS as $campo => $info) {
                if ($items[$campo] === 1) {
                    try {
                        DB::table($info['tabla'])
                            ->where('id', $idtramite)
                            ->update(['idnota' => $id]);
                    } catch (\Exception $e) {
                        // Ignorar si la tabla no tiene el campo
                    }
                }
            }
        }

        return redirect()->route('notas.show', $id)
                         ->with('success', "Nota de entrega #$id guardada correctamente.");
    }

    // ── Anular nota ──────────────────────────────────────────────────────────
    public function anular(int $id)
    {
        $this->soloAdminOTecnico();

        DB::table('notas')->where('id', $id)->update(['anul' => 1]);

        return redirect()->route('notas.index')
                         ->with('success', "Nota de entrega #$id anulada correctamente.");
    }

    // ── Helpers ──────────────────────────────────────────────────────────────
    private function soloAdminOTecnico(): void
    {
        if (!in_array(auth()->user()->tipo, [1, 4]))
            abort(403, 'Privilegio de acceso denegado.');
    }
}