<?php

namespace App\Http\Controllers;

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

/**
 * ReporteController
 *
 * Controlador central para todos los reportes PDF del sistema.
 * Reemplaza el patrón original: datos*.php → *.txt → pdf_*.php (fpdf)
 * Nuevo patrón: método aquí → vista Blade → DomPDF
 *
 * Organización por fases:
 *   Fase 1 — Listados simples (catálogos)
 *   Fase 2 — Reportes por módulo (detalle por ID)
 *   Fase 3 — Reportes con filtros y fechas
 *   Fase 4 — Reportes complejos (kardex, cartera)
 */
class ReporteController extends Controller
{
    // =========================================================================
    // HELPERS INTERNOS — equivalen a los métodos de los datos*.php
    // =========================================================================

    /** Nombre de urbanización por ID (reemplaza $mi_urbanizacion->sacanomb()) */
    private function nomUrbanizacion($id): string
    {
        return DB::table('urbanizaciones')->where('id', $id)->value('nombre') ?? '';
    }

    /** Nombre de distrito por ID (reemplaza $mi_distrito->sacanomb()) */
    private function nomDistrito($id): string
    {
        return DB::table('distritos')->where('id', $id)->value('nombre') ?? '';
    }

    /** Nombre completo de cliente por ID (reemplaza $mi_cliente->sacanom()) */
    private function nomCliente($id): string
    {
        $c = DB::table('clientes')->where('id', $id)->first();
        return $c ? trim($c->nombre . ' ' . $c->apellidos) : '';
    }

    /** Nombre de ciudad por código (reemplaza $mi_ciudad->sacanomb()) */
    private function nomCiudad($codigo): string
    {
        return DB::table('ciudades')->where('codigociu', $codigo)->value('nombreciu') ?? '';
    }

    /** Nombre de cobrador por ID (reemplaza datoscobrador) */
    private function nomCobrador($id): string
    {
        $c = DB::table('cobradores')->where('id', $id)->first();
        return $c ? trim($c->nombre . ' ' . $c->apellidos) : '';
    }

    /** Nombre de vendedor por ID (reemplaza datosvendedor) */
    private function nomVendedor($id): string
    {
        $v = DB::table('vendedores')->where('id', $id)->first();
        return $v ? trim($v->nombre . ' ' . $v->apellidos) : '';
    }

    /** Tipo de usuario en texto (reemplaza tipoId() de datosusuarios.php) */
    private function tipoId(int $tipoid): string
    {
        return [
            1 => 'Cliente', 2 => 'Contrato', 3 => 'Recibo',
            4 => 'Autorización', 5 => 'Trámite', 6 => 'Ajuste (Abono)',
            9 => 'Distrito', 10 => 'Lote', 11 => 'Usuario', 13 => 'Ajuste (Cargo)',
        ][$tipoid] ?? 'Desconocido';
    }

    /** Tipo de movimiento en texto (reemplaza tipoMovimiento() de datosusuarios.php) */
    private function tipoMovimiento(int $tipomov): string
    {
        return [
            1 => 'Nuevo', 2 => 'Modificar', 3 => 'Eliminar',
            4 => 'Seleccionar', 5 => 'Login', 6 => 'Logout',
        ][$tipomov] ?? '';
    }

    /** Nombre de ubicación por número (reemplaza tipoUbi() de datosusuarios.php) */
    private function tipoUbicacion(int $ubi): string
    {
        return [1 => 'Cosmos 79', 10 => 'Tarapacá'][$ubi] ?? '';
    }

    /** Estado de lote en texto */
    private function estadoLote(int $estado): string
    {
        return [
            1 => 'Disponible', 2 => 'Reservado', 3 => 'En Proceso',
            4 => 'Vendido', 5 => 'En Trámite', 6 => 'Consolidado',
        ][$estado] ?? '';
    }

    /** Tipo de lote en texto */
    private function tipoLote(int $tipo): string
    {
        return [1 => 'Calle', 2 => 'Avenida', 3 => 'Área Verde'][$tipo] ?? '';
    }

    /** Cabecera común para todos los PDFs */
    private function cabecera(): array
    {
        return [
            'fecha_sistema'  => session('fecha_sistema', FechaHelper::hoy()),
            'tc_sistema'     => session('tc_sistema', 0),
            'ubicacion_num'  => session('ubicacion_num', 1),
            'nombre_sistema' => session('ubicacion_num', 1) == 1 ? 'Cosmos 79' : 'Tarapacá',
        ];
    }

    // =========================================================================
    // FASE 1 — LISTADOS SIMPLES (catálogos)
    // =========================================================================

    /**
     * Listado de clientes
     * Reemplaza: listadodeclientes.php → pdf_listadeclientes.php
     */
    public function listadoClientes()
    {
        $clientes = DB::table('clientes')
            ->orderBy('apellidos')
            ->get()
            ->map(function ($c) {
                $c->ciudad_nombre = $this->nomCiudad($c->ciudad);
                return $c;
            });

        $pdf = Pdf::loadView('reportes.listado_clientes', [
            'clientes' => $clientes,
            'cab'      => $this->cabecera(),
        ])->setPaper('letter', 'portrait');

        return $pdf->stream('listado_clientes.pdf');
    }

    /**
     * Listado de distritos
     * Reemplaza: listadodedistritos.php → pdf_listadodedistritos.php
     */
    public function listadoDistritos()
    {
        $distritos = DB::table('distritos')
            ->join('urbanizaciones', 'distritos.relacion', '=', 'urbanizaciones.id')
            ->select('distritos.*', 'urbanizaciones.nombre as nom_urbanizacion')
            ->orderBy('distritos.relacion')
            ->orderBy('distritos.nombre')
            ->get();

        $pdf = Pdf::loadView('reportes.listado_distritos', [
            'distritos' => $distritos,
            'cab'       => $this->cabecera(),
        ])->setPaper('letter', 'portrait');

        return $pdf->stream('listado_distritos.pdf');
    }

    /**
     * Listado de urbanizaciones
     * Reemplaza: listadodeurbanizaciones.php → pdf_listadeurbanizaciones.php
     */
    public function listadoUrbanizaciones()
    {
        $urbanizaciones = DB::table('urbanizaciones')
            ->orderBy('nombre')
            ->get();

        $pdf = Pdf::loadView('reportes.listado_urbanizaciones', [
            'urbanizaciones' => $urbanizaciones,
            'cab'            => $this->cabecera(),
        ])->setPaper('letter', 'portrait');

        return $pdf->stream('listado_urbanizaciones.pdf');
    }

    /**
     * Listado de cobradores
     * Reemplaza: listadodecobradores.php → pdf_listadecobradores.php
     */
    public function listadoCobradores()
    {
        $cobradores = DB::table('cobradores')
            ->orderBy('apellidos')
            ->get();

        $pdf = Pdf::loadView('reportes.listado_cobradores', [
            'cobradores' => $cobradores,
            'cab'        => $this->cabecera(),
        ])->setPaper('letter', 'portrait');

        return $pdf->stream('listado_cobradores.pdf');
    }

    /**
     * Listado de vendedores
     * Reemplaza: listadodevendedores.php → pdf_listadevendedores.php
     */
    public function listadoVendedores()
    {
        $vendedores = DB::table('vendedores')
            ->orderBy('apellidos')
            ->get();

        $pdf = Pdf::loadView('reportes.listado_vendedores', [
            'vendedores' => $vendedores,
            'cab'        => $this->cabecera(),
        ])->setPaper('letter', 'portrait');

        return $pdf->stream('listado_vendedores.pdf');
    }

    /**
     * Listado de tipos de cambio
     * Reemplaza: lista_tipodecambio.php → pdf_listipodecambio.php
     */
    public function listadoTipoCambio()
    {
        $tipos = DB::table('tipocambios')
            ->orderBy('fecha', 'desc')
            ->get()
            ->map(function ($t) {
                $t->fecha_local = FechaHelper::bdToLocal($t->fecha);
                return $t;
            });

        $pdf = Pdf::loadView('reportes.listado_tipo_cambio', [
            'tipos' => $tipos,
            'cab'   => $this->cabecera(),
        ])->setPaper('letter', 'portrait');

        return $pdf->stream('listado_tipo_cambio.pdf');
    }

    /**
     * Listado de terrenos (lotes con datos de urb/dist)
     * Reemplaza: listado_terrenos.php → pdf_listado_terrenos.php
     */
    public function listadoTerrenos(Request $request)
    {
        $idUrb  = $request->get('urbanizacion', 0);
        $idDist = $request->get('distrito', 0);

        $query = DB::table('lotes')
            ->join('urbanizaciones', 'lotes.urbanizacion', '=', 'urbanizaciones.id')
            ->join('distritos', 'lotes.relacion', '=', 'distritos.id')
            ->select(
                'lotes.*',
                'urbanizaciones.nombre as nom_urbanizacion',
                'distritos.nombre as nom_distrito'
            );

        if ($idUrb)  $query->where('lotes.urbanizacion', $idUrb);
        if ($idDist) $query->where('lotes.relacion', $idDist);

        $lotes = $query->orderBy('lotes.urbanizacion')
                       ->orderBy('lotes.relacion')
                       ->orderBy('lotes.nombre')
                       ->get()
                       ->map(function ($l) {
                           $l->iteest_texto = $this->estadoLote($l->iteest);
                           $l->itetip_texto = $this->tipoLote($l->itetip);
                           return $l;
                       });

        $pdf = Pdf::loadView('reportes.listado_terrenos', [
            'lotes' => $lotes,
            'cab'   => $this->cabecera(),
        ])->setPaper('letter', 'landscape');

        return $pdf->stream('listado_terrenos.pdf');
    }

    /**
     * Lotes de terreno disponibles (iteest = 1)
     * Reemplaza: lotesdeterrenodisponible.php → pdf_lotesdeterrenodisponible.php
     */
    public function lotesDisponibles(Request $request)
    {
        $idUrb  = $request->get('urbanizacion', 0);
        $idDist = $request->get('distrito', 0);

        $query = DB::table('lotes')
            ->join('urbanizaciones', 'lotes.urbanizacion', '=', 'urbanizaciones.id')
            ->join('distritos', 'lotes.relacion', '=', 'distritos.id')
            ->select(
                'lotes.*',
                'urbanizaciones.nombre as nom_urbanizacion',
                'distritos.nombre as nom_distrito'
            )
            ->where('lotes.iteest', 1); // 1 = Disponible

        if ($idUrb)  $query->where('lotes.urbanizacion', $idUrb);
        if ($idDist) $query->where('lotes.relacion', $idDist);

        $lotes = $query->orderBy('lotes.urbanizacion')
                       ->orderBy('lotes.relacion')
                       ->orderBy('lotes.nombre')
                       ->get();

        $pdf = Pdf::loadView('reportes.lotes_disponibles', [
            'lotes' => $lotes,
            'cab'   => $this->cabecera(),
        ])->setPaper('letter', 'landscape');

        return $pdf->stream('lotes_disponibles.pdf');
    }

    // =========================================================================
    // FASE 3 — REPORTE DE SEGUIMIENTO (usa datosusuarios.php)
    // =========================================================================

    /**
     * Reporte de seguimiento / auditoría
     * Reemplaza: seguimiento.php → pdf_seguimiento.php
     * Usa los helpers tipoId(), tipoMovimiento(), tipoUbicacion()
     */
    public function seguimiento(Request $request)
    {
        $request->validate([
            'fecha_ini' => 'required|date',
            'fecha_fin' => 'required|date|after_or_equal:fecha_ini',
        ]);

        $fechaIni = $request->fecha_ini;
        $fechaFin = $request->fecha_fin;
        $usuario  = $request->get('usuario', 0);

        $query = DB::table('seguimiento')
            ->where('fecha', '>=', $fechaIni)
            ->where('fecha', '<=', $fechaFin);

        if ($usuario) {
            $query->where('usuario', $usuario);
        }

        $registros = $query->orderBy('fecha', 'desc')
                           ->orderBy('hora', 'desc')
                           ->get()
                           ->map(function ($s) {
                               $s->tipomov_texto  = $this->tipoMovimiento($s->tipomov);
                               $s->tipoid_texto   = $this->tipoId($s->tipoid);
                               $s->ubicacion_texto = $this->tipoUbicacion($s->ubicacion);
                               $s->fecha_local    = FechaHelper::bdToLocal($s->fecha);
                               // Nombre del usuario que hizo la acción
                               $u = DB::table('usuarios')->where('id', $s->usuario)->first();
                               $s->nom_usuario = $u ? trim($u->nombre . ' ' . $u->apellidos) : $s->usuario;
                               return $s;
                           });

        $usuarios = DB::table('usuarios')
            ->where('estado', 0)
            ->orderBy('nombre')
            ->get();

        $pdf = Pdf::loadView('reportes.seguimiento', [
            'registros' => $registros,
            'fecha_ini' => FechaHelper::bdToLocal($fechaIni),
            'fecha_fin' => FechaHelper::bdToLocal($fechaFin),
            'cab'       => $this->cabecera(),
        ])->setPaper('letter', 'landscape');

        return $pdf->stream('seguimiento.pdf');
    }

    // =========================================================================
    // FORMULARIOS DE FILTRO — vistas HTML para ingresar parámetros
    // =========================================================================

    /**
     * Formulario de filtros para reportes que lo necesitan
     * (terrenos, lotes disponibles, seguimiento, etc.)
     */
    public function formulario(string $reporte)
    {
        $urbanizaciones = DB::table('urbanizaciones')->orderBy('nombre')->get();
        $distritos      = DB::table('distritos')->orderBy('nombre')->get();
        $cobradores     = DB::table('cobradores')->orderBy('apellidos')->get();
        $usuarios       = DB::table('usuarios')->where('estado', 0)->orderBy('nombre')->get();

        return view('reportes.filtros', compact(
            'reporte', 'urbanizaciones', 'distritos', 'cobradores', 'usuarios'
        ));
    }
}