<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Helpers\FechaHelper;
use App\Helpers\SeguimientoHelper;
use Barryvdh\DomPDF\Facade\Pdf;
// use App\Helpers\FechaHelper;

/**
 * AutorizacionController — Módulo Autorizaciones de Trámite
 *
 * Archivos PHP migrados:
 *   index.php              → index()
 *   rejilla.php            → index() con paginación
 *   nueva_autorizacion.php → create()
 *   guardar_autorizacion.php → store()
 *   ver_autorizacion.php   → show()
 *   anular_autorizacion.php → anular()
 *
 * Tabla principal: autorizaciones
 * Al crear genera registros en: tramites, transferencias, protocolos,
 *   planoslotes, visados, minutas, derechosreales (mismo id)
 * Al anular: marca anul=1 en todas esas tablas + lote vuelve a iteest=4
 *
 * Lotes elegibles: iteest=4 (Vendido = pagado completamente)
 * Acceso: admin (tipo=1) y técnico (tipo=4)
 */
class AutorizacionController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

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

    // Iniciamos la consulta con un Join para tener acceso al nombre del cliente
    $query = DB::table('autorizaciones')
        ->join('clientes', 'autorizaciones.idcliente', '=', 'clientes.id')
        ->select('autorizaciones.*', 'clientes.nombre as nom_cliente')
        ->where('autorizaciones.anul', 0);

    if ($buscar !== '') {
        if ($buscax === 'autorizacion') {
            $query->where('autorizaciones.id', $buscar);
        } 
        elseif ($buscax === 'cliente') {
            // CAMBIO: Ahora busca por nombre usando LIKE
            $query->where('clientes.nombre', 'like', "%$buscar%");
        } 
        elseif ($buscax === 'lote') {
            $query->where('autorizaciones.lote', 'like', "%$buscar%");
        }
    }

    $autorizaciones = $query->orderBy('autorizaciones.id', 'desc')
        ->paginate(20)
        ->withQueryString();

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

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

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

        // Verificar si tiene trámite activo
        $tramite = DB::table('tramites')
            ->where('id', $id)
            ->where('anul', 0)
            ->first();

        return view('autorizaciones.show', compact(
            'auto', 'cliente', 'urb', 'dis', 'tramite'
        ));
    }

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

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

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

    // ── AJAX: datos del lote para el select4 ────────────────────────────────
    // Equivale a ver_distritos_lotes.php cuando select=select4
    // Devuelve: idcontrato, idcliente, nombre_cliente
    public function getDatosLote(int $idlote)
    {
        $contrato = DB::table('contratos')
            ->where('idlote', $idlote)
            ->where('anul', 0)
            ->first(['id as idcontrato', 'idcliente']);

        if (!$contrato) {
            return response()->json([
                'idcontrato'     => null,
                'idcliente'      => null,
                'nombre_cliente' => 'Desconocido',
            ]);
        }

        $cliente = DB::table('clientes')
            ->where('id', $contrato->idcliente)
            ->value('nombre');

        return response()->json([
            'idcontrato'     => $contrato->idcontrato,
            'idcliente'      => $contrato->idcliente,
            'nombre_cliente' => $cliente ?? 'Desconocido',
        ]);
    }

    // ── AJAX: lotes disponibles para autorizar (iteest=4, Vendido) ───────────
    public function getLotesDisponibles(int $idDistrito)
    {
        $lotes = DB::table('lotes')
            ->where('relacion', $idDistrito)
            ->where('iteest', 4) // Solo Vendidos (pagados completamente)
            ->orderBy('manzano')->orderBy('nombre')
            ->get(['id', 'manzano', 'nombre', 'superf']);

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

    // ── Guardar nueva autorización ───────────────────────────────────────────
    public function store(Request $request)
    {
        $this->soloAdminOTecnico();

        $request->validate([
            'id'           => 'required|integer|unique:autorizaciones,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 autorización 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.',
            'observaciones.required' => 'Las observaciones son obligatorias.',
        ]);

        $id          = (int)$request->id;
        $idlote      = (int)$request->select3;
        $idcliente   = (int)$request->idcliente;
        $idcontrato  = (int)$request->idcontrato;
        $fecha       = FechaHelper::localToBd($request->fecha);
        $hoy         = now('America/La_Paz')->format('Y-m-d');

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

        // ── 1. Insertar en autorizaciones ────────────────────────────────────
        DB::table('autorizaciones')->insert([
            'id'            => $id,
            'movtip'        => 2,
            'urbanizacion'  => $request->select1,
            'distrito'      => $request->select2,
            'idlote'        => $idlote,
            'manzano'       => $lote->manzano ?? '',
            'lote'          => $lote->nombre  ?? '',
            'fecha'         => $fecha,
            'idcliente'     => $idcliente,
            'idcontrato'    => $idcontrato,
            'entregado'     => $request->entregado,
            'observaciones' => $request->observaciones,
            'anul'          => 0,
        ]);

        // ── 2. Actualizar lote a En Trámite (iteest=5) ───────────────────────
        DB::table('lotes')->where('id', $idlote)->update(['iteest' => 5]);

        // ── 3. Seguimiento autorizacion (tipoid=4) ───────────────────────────
        SeguimientoHelper::registrar($id, 1, 4);

        // ── 4. Generar el trámite y sus tablas relacionadas ──────────────────
        $this->generarTramite($id, $fecha, $idlote, $request->select1,
                              $request->select2, $lote, $idcontrato, $idcliente);

        return redirect()->route('autorizaciones.show', $id)
                         ->with('success', "Autorización de trámite #$id creada correctamente.");
    }

    // ── Anular autorización ───────────────────────────────────────────────────
    public function anular(int $id)
    {
        $this->soloAdmin();

        $auto = DB::table('autorizaciones')->where('id', $id)->first();
        if (!$auto) abort(404);

        // Anular en todas las tablas del trámite
        $tablas = ['autorizaciones', 'tramites', 'transferencias', 'protocolos',
                   'planoslotes', 'visados', 'minutas', 'derechosreales'];

        foreach ($tablas as $tabla) {
            try {
                DB::table($tabla)->where('id', $id)->update(['anul' => 1]);
            } catch (\Exception $e) {
               
            }
        }

        // Seguimiento baja (tipoid=4)
        SeguimientoHelper::registrar($id, 3, 4);

        // El lote vuelve a Vendido (iteest=4) — ya pagado pero sin trámite
        DB::table('lotes')->where('id', $auto->idlote)->update(['iteest' => 4]);

        return redirect()->route('autorizaciones.index')
                         ->with('success', "Autorización #$id anulada. El lote vuelve a estado Vendido.");
    }

    public function pdf($id)
{
    // ── Datos de la autorización ─────────────────────────────
    $auto = DB::table('autorizaciones')->where('id', $id)->first();
    abort_if(!$auto, 404);
 
    // ── Contrato vinculado al lote ───────────────────────────
    $contrato = DB::table('contratos')
        ->where('idlote', $auto->idlote)
        ->where('anul', 0)
        ->first();
 
    // ── Urbanización y distrito (nombres) ────────────────────
    $nomUrb  = DB::table('urbanizaciones')->where('id', $auto->urbanizacion)->value('nombre') ?? '';
    $nomDist = DB::table('distritos')->where('id', $auto->distrito)->value('nombre') ?? '';
 
    // ── Superficie del lote ──────────────────────────────────
    $superficie = DB::table('lotes')->where('id', $auto->idlote)->value('superf') ?? '';
 
    // ── Cliente (nombre completo) ────────────────────────────
$nomCliente = DB::table('clientes')
    ->where('id', $auto->idcliente)
    ->value('nombre') ?? '';
 
    // ── Usuario que imprime (quien está logueado) ────────────
$conexion = session('db_connection', 'cosmos79');
$usuarioActual = DB::connection($conexion)
    ->table('usuarios')
    ->where('id', auth()->id())
    ->first();
$nomUsuario = $usuarioActual
    ? trim($usuarioActual->nombre . ' ' . $usuarioActual->apellidos)
    : '';
 
    $pdf = Pdf::loadView('autorizaciones.pdf', [
        'auto'         => $auto,
        'contrato'     => $contrato,
        'nom_urb'      => $nomUrb,
        'nom_dist'     => $nomDist,
        'superficie'   => $superficie,
        'nom_cliente'  => $nomCliente,
        'nom_usuario'  => $nomUsuario,   // "ENTREGADO POR"
        'fecha_auto'   => FechaHelper::bdToLocal($auto->fecha),
        'fecha_cont'   => $contrato ? FechaHelper::bdToLocal($contrato->fecha) : '',
        'cab'          => [
            'fecha_sistema' => session('fecha_sistema', FechaHelper::hoy()),
            'tc_sistema'    => session('tc_sistema', 0),
            'nombre_sistema'=> session('ubicacion_num', 1) == 1 ? 'Cosmos 79' : 'Tarapacá',
        ],
    ])->setPaper('letter', 'portrait');
 
    return $pdf->stream('autorizacion_' . $id . '.pdf');
}

    // ── Helpers privados ─────────────────────────────────────────────────────

private function generarTramite(
    int $id, string $fecha, int $idlote, int $urbanizacion,
    int $distrito, $lote, int $idcontrato, int $idcliente
): void {
    $manzano = $lote->manzano ?? '';
    $nomLote = $lote->nombre  ?? '';
    $fv      = '0000-00-00';  // DATE NOT NULL sin default
 
    // ── TRAMITES ─────────────────────────────────────────────
    // Todos los campos son NOT NULL
    DB::table('tramites')->insert([
        'id'            => $id,
        'fecha'         => $fecha,
        'idlote'        => $idlote,
        'urbanizacion'  => $urbanizacion,
        'distrito'      => $distrito,
        'manzano'       => $manzano,
        'lote'          => $nomLote,
        'idcontrato'    => $idcontrato,
        'idcliente'     => $idcliente,
        'conyugue'      => '',
        'iniciominuta'  => $fv,
        'fminuta1'      => $fv,  'ominuta1' => '',
        'fminuta2'      => $fv,  'ominuta2' => '',
        'fminuta3'      => $fv,  'ominuta3' => '',
        'fminuta4'      => $fv,  'ominuta4' => '',
        'fminuta5'      => $fv,  'ominuta5' => '',
        'idabogado'     => 0,
        'finminuta'     => $fv,
        'idnota'        => 0,
        'observaciones' => '',
        'respons'       => 'Sistema',
        'anul'          => 0,
    ]);
 
    SeguimientoHelper::registrar($id, 1, 5);
 
    // ── TRANSFERENCIAS ───────────────────────────────────────
    // Todos NOT NULL
    DB::table('transferencias')->insert([
        'id'             => $id,
        'ftransferencia' => $fv,
        'otransferencia' => '',
        'idnota'         => 0,
        'observaciones'  => '',
        'respons'        => '',
        'anul'           => 0,
    ]);
 
    // ── PROTOCOLOS ───────────────────────────────────────────
    // Todos NOT NULL — incluye notario INT(5)
    DB::table('protocolos')->insert([
        'id'              => $id,
        'inicioprotocolo' => $fv,
        'fprotocolo1'     => $fv,  'oprotocolo1' => '',
        'fprotocolo2'     => $fv,  'oprotocolo2' => '',
        'fprotocolo3'     => $fv,  'oprotocolo3' => '',
        'fprotocolo4'     => $fv,  'oprotocolo4' => '',
        'fprotocolo5'     => $fv,  'oprotocolo5' => '',
        'fprotocolo6'     => $fv,  'oprotocolo6' => '',
        'fprotocolo7'     => $fv,  'oprotocolo7' => '',
        'testimonio'      => '',
        'notario'         => 0,
        'finprotocolo'    => $fv,
        'idnota'          => 0,
        'observaciones'   => '',
        'respons'         => '',
        'anul'            => 0,
    ]);
 
    // ── PLANOSLOTES ──────────────────────────────────────────
    // idarquitecto es YES|NULL → puede ser null
    DB::table('planoslotes')->insert([
        'id'           => $id,
        'inicioplano'  => $fv,
        'fplano1'      => $fv,  'oplano1' => '',
        'fplano2'      => $fv,  'oplano2' => '',
        'fplano3'      => $fv,  'oplano3' => '',
        'idarquitecto' => null,  // YES|NULL → permitido
        'finplano'     => $fv,
        'idnota'       => 0,
        'observaciones'=> '',
        'respons'      => '',
        'anul'         => 0,
    ]);
 
    // ── VISADOS ──────────────────────────────────────────────
    // Todos NOT NULL
    DB::table('visados')->insert([
        'id'       => $id,
        'fvisado1' => $fv,  'ovisado1' => '',
        'fvisado2' => $fv,  'ovisado2' => '',
        'fvisado3' => $fv,  'ovisado3' => '',
        'idnota'   => 0,
        'observaciones' => '',
        'respons'  => '',
        'anul'     => 0,
    ]);
 
    // ── MINUTAS ──────────────────────────────────────────────
    // Todos NOT NULL — incluye testimonio VARCHAR(10) y notario INT(5)
    DB::table('minutas')->insert([
        'id'           => $id,
        'iniciominuta' => $fv,
        'fminuta1'     => $fv,  'ominuta1'  => '',
        'fminuta2'     => $fv,  'ominuta2'  => '',
        'fminuta3'     => $fv,  'ominuta3'  => '',
        'fminuta4'     => $fv,  'ominuta4'  => '',
        'fminuta5'     => $fv,  'ominuta5'  => '',
        'fminuta6'     => $fv,  'ominuta6'  => '',
        'fminuta7'     => $fv,  'ominuta7'  => '',
        'fminuta8'     => $fv,  'ominuta8'  => '',
        'fminuta9'     => $fv,  'ominuta9'  => '',
        'fminuta10'    => $fv,  'ominuta10' => '',
        'testimonio'   => '',
        'notario'      => 0,
        'finminuta'    => $fv,
        'idnota'       => 0,
        'observaciones'=> '',
        'respons'      => '',
        'anul'         => 0,
    ]);
 
    // ── DERECHOS REALES ──────────────────────────────────────
    // Campos YES|NULL: oddrr1..4, ddrr, entregadoa, respons → null
    // Campos NO|NULL sin default: fddrr1..4, inicioddrr, finddrr, idnota, anul
    DB::table('derechosreales')->insert([
        'id'           => $id,
        'inicioddrr'   => $fv,
        'fddrr1'       => $fv,  'oddrr1' => null,
        'fddrr2'       => $fv,  'oddrr2' => null,
        'fddrr3'       => $fv,  'oddrr3' => null,
        'ddrr'         => null,
        'fddrr4'       => $fv,  'oddrr4' => null,
        'entregadoa'   => null,
        'finddrr'      => $fv,
        'idnota'       => 0,
        'observaciones'=> '',
        'respons'      => null,
        'anul'         => 0,
    ]);
}

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

    private function soloAdmin(): void
    {
        if (auth()->user()->tipo != 1)
            abort(403, 'Solo el administrador puede anular autorizaciones.');
    }
}