<?php
namespace App\Http\Controllers;

use App\Models\Cliente;
use App\Models\Clientetmp;
use App\Models\Ciudad;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
use Carbon\Carbon;

class ClienteController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

    // ── Listado con búsqueda ─────────────────────────────────────────────────
    public function index(Request $request)
    {
        $buscar = $request->input('buscar', '');

        $clientes = Cliente::when($buscar, function ($q) use ($buscar) {
                $q->where('id',     'like', "$buscar%")
                  ->orWhere('nombre', 'like', "%$buscar%")
                  ->orWhere('ci',     'like', "$buscar%");
            })
            ->orderBy('id', 'desc')
            ->paginate(30)
            ->withQueryString();

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

    // ── Ver detalle ──────────────────────────────────────────────────────────
    public function show($id)
    {
        $cliente   = Cliente::findOrFail($id);
        $ciudadRel = Ciudad::where('codigociu', $cliente->ciudad)->first();

        // Contratos con datos relacionados
        $contratos = DB::table('contratos')
            ->leftJoin('urbanizaciones', 'contratos.urbanizacion', '=', 'urbanizaciones.id')
            ->leftJoin('distritos',      'contratos.distrito',     '=', 'distritos.id')
            ->where('contratos.idcliente', $id)
            ->select(
                'contratos.*',
                'urbanizaciones.nombre as nom_urb',
                'distritos.nombre      as nom_dis'
            )
            ->get();

        return view('clientes.show', compact('cliente', 'ciudadRel', 'contratos'));
    }

    // ── Formulario nuevo cliente ─────────────────────────────────────────────
    // El flujo original: se ingresa titular + codeudores en clientestmp,
    // luego se genera el contrato. Replicamos ese flujo.
    public function create()
    {
        $ciudades   = Ciudad::orderBy('codigociu')->get();
        $maxClientes    = Cliente::max('id')    ?? 0;
        $maxClientesTmp = Clientetmp::max('id') ?? 0;
        $nuevoId   = max($maxClientes, $maxClientesTmp) + 1;
        $nuevoGrupo = (Clientetmp::max('idgrupo') ?? 0) + 1;

        // Limpiar temporales huérfanos de sesiones anteriores
        Clientetmp::where('idgrupo', $nuevoGrupo)->delete();

        return view('clientes.create', compact('ciudades', 'nuevoId', 'nuevoGrupo'));
    }

    // ── Guardar cliente en tabla temporal ────────────────────────────────────
    public function storeTmp(Request $request)
    {
        $request->validate([
            'nombre'    => 'required|string',
            'ci'        => 'required|string|max:15',
            'direccion' => 'required|string|max:60',
            'idgrupo'   => 'required|integer',
            'tipo'      => 'required|in:Titular,Codeudor',
        ]);

        // Construir nombre completo
        $nombre = Str::upper(trim(
            $request->nombre . ' ' .
            $request->paterno . ' ' .
            $request->materno
        ));

        // Fix: el ID debe ser único entre AMBAS tablas
        // Si solo usamos Cliente::max('id'), el Titular y Codeudor reciben el mismo ID
        $maxClientes   = Cliente::max('id')    ?? 0;
        $maxClientesTmp = Clientetmp::max('id') ?? 0;
        $nuevoId = max($maxClientes, $maxClientesTmp) + 1;
        $fecha   = now('America/La_Paz')->format('Y-m-d');

        Clientetmp::create([
            'id'            => $nuevoId,
            'fecha'         => $fecha,
            'nombre'        => $nombre,
            'ci'            => $request->ci,
            'direccion'     => Str::upper($request->direccion),
            'ciudad'        => $request->cboCiudades ?? 0,
            'telefono'      => $request->telefono,
            'celular'       => $request->celular,
            'fax'           => $request->fax ?? '',
            'email'         => $request->email ?? '',
            'casilla'       => $request->casilla ?? '',
            'respons'       => '',
            'observaciones' => Str::upper($request->observaciones ?? ''),
            'sexo'          => $request->sexo ?? 0,
            'estadocivil'   => $request->estadocivil ?? 0,
            'tipo'          => $request->tipo,
            'idgrupo'       => $request->idgrupo,
            'temporal'      => 0,
        ]);

        $lineas = Clientetmp::where('idgrupo', $request->idgrupo)->get();

        return response()->json([
            'success' => true,
            'lineas'  => $lineas,
            'nuevoId' => $nuevoId + 1,
        ]);
    }

    // ── Eliminar línea temporal (codeudor) ───────────────────────────────────
    public function destroyTmp(Request $request)
    {
        $id      = $request->input('id');
        $idgrupo = $request->input('idgrupo');

        Clientetmp::where('id', $id)->where('idgrupo', $idgrupo)->delete();

        $lineas = Clientetmp::where('idgrupo', $idgrupo)->get();
        return response()->json(['success' => true, 'lineas' => $lineas]);
    }

    // ── AJAX: verificar si cliente ya existe ─────────────────────────────────
    public function comprobar(Request $request)
    {
        $nombre = Str::upper($request->input('nombre', ''));
        $tipo   = $request->input('tipo') === 'Titular' ? 1 : 2;

        $cliente = Cliente::where('nombre', $nombre)
                          ->where('tipo', $tipo)
                          ->first();

        if ($cliente) {
            return response()->json([
                'existe'    => true,
                'idcliente' => $cliente->id,
                'nombre'    => $cliente->nombre,
                'ci'        => $cliente->ci,
                'tipo'      => $tipo === 1 ? 'Titular' : 'Codeudor',
            ]);
        }

        return response()->json(['existe' => false]);
    }

    // ── Confirmar y guardar todos los clientes del grupo ─────────────────────
public function confirmarGrupo(Request $request)
{
    $idgrupo = $request->input('idgrupo');
    $lineas  = Clientetmp::where('idgrupo', $idgrupo)->get();

    if ($lineas->isEmpty()) {
        return back()->with('error', 'Ingrese al menos un cliente.');
    }

    $now      = now('America/La_Paz');
    $iduser   = auth()->id();
    $ubicacion = session('ubicacion_num', 1);

    foreach ($lineas as $tmp) {
        if (!Cliente::find($tmp->id)) {
            Cliente::create([
                'id'            => $tmp->id,
                'fecha'         => $tmp->fecha,
                'nombre'        => $tmp->nombre,
                'ci'            => $tmp->ci,
                'direccion'     => $tmp->direccion,
                'ciudad'        => $tmp->ciudad,
                'telefono'      => $tmp->telefono,
                'celular'       => $tmp->celular,
                'fax'           => $tmp->fax,
                'email'         => $tmp->email,
                'casilla'       => $tmp->casilla,
                'respons'       => $tmp->respons ?? '',
                'observaciones' => $tmp->observaciones ?? '',
                'sexo'          => $tmp->sexo,
                'estadocivil'   => $tmp->estadocivil,
                'tipo'          => $tmp->tipo === 'Titular' ? 1 : 2,
            ]);

            $max = DB::table('seguimiento')->max('no') + 1;
            DB::table('seguimiento')->insert([
                'no'        => $max,
                'id'        => $tmp->id,
                'tipomov'   => 1,
                'tipoid'    => 1,
                'ubicacion' => $ubicacion,
                'usuario'   => $iduser,
                'fecha'     => $now->format('Y-m-d'),
                'hora'      => $now->format('H:i:s'),
            ]);
        }
    }

    // ✅ NO borrar clientestmp aquí — los necesita el formulario de contrato
    // La limpieza ocurre en ContratoController::store() después de guardar

    return redirect()->route('contratos.create', ['idgrupo' => $idgrupo])
                     ->with('success', 'Clientes registrados. Complete el contrato.');
}


// public function confirmarGrupo(Request $request)
// {
//     $idgrupo = $request->input('idgrupo');
//     $lineas  = Clientetmp::where('idgrupo', $idgrupo)->get();

//     if ($lineas->isEmpty()) {
//         return back()->with('error', 'Ingrese al menos un cliente.');
//     }

//     $now      = now('America/La_Paz');
//     $iduser   = auth()->id();
//     $ubicacion = session('ubicacion_num', 1);

//     foreach ($lineas as $tmp) {
//         if (!Cliente::find($tmp->id)) {
//             Cliente::create([
//                 'id'            => $tmp->id,
//                 'fecha'         => $tmp->fecha,
//                 'nombre'        => $tmp->nombre,
//                 'ci'            => $tmp->ci,
//                 'direccion'     => $tmp->direccion,
//                 'ciudad'        => $tmp->ciudad,
//                 'telefono'      => $tmp->telefono,
//                 'celular'       => $tmp->celular,
//                 'fax'           => $tmp->fax,
//                 'email'         => $tmp->email,
//                 'casilla'       => $tmp->casilla,
//                 'respons'       => $tmp->respons,
//                 'observaciones' => $tmp->observaciones,
//                 'sexo'          => $tmp->sexo,
//                 'estadocivil'   => $tmp->estadocivil,
//                 'tipo'          => $tmp->tipo === 'Titular' ? 1 : 2,
                
//                 // 'manzano'       => $tmp->manzano ?? '',
//                 // 'lote'          => $tmp->lote ?? '',
//                 // 'temporal'      => 0,
//             ]);

//             $max = DB::table('seguimiento')->max('no') + 1;
//             DB::table('seguimiento')->insert([
//                 'no'        => $max,
//                 'id'        => $tmp->id,
//                 'tipomov'   => 1,
//                 'tipoid'    => 1,
//                 'ubicacion' => $ubicacion,
//                 'usuario'   => $iduser,
//                 'fecha'     => $now->format('Y-m-d'),
//                 'hora'      => $now->format('H:i:s'),
//             ]);
//         }
//     }

//     Clientetmp::where('idgrupo', $idgrupo)->delete();

//     return redirect()->route('contratos.create', ['idgrupo' => $idgrupo])
//                      ->with('success', 'Clientes registrados. Complete el contrato.');
// }

    // ── Formulario editar ────────────────────────────────────────────────────
    public function edit($id)
    {
        $cliente  = Cliente::findOrFail($id);
        $ciudades = Ciudad::orderBy('codigociu')->get();
        return view('clientes.edit', compact('cliente', 'ciudades'));
    }

    // ── Guardar edición ──────────────────────────────────────────────────────
    public function update(Request $request, $id)
    {
        $request->validate([
            'nombre'    => 'required|string|max:45',
            'ci'        => 'required|string|max:15',
            'direccion' => 'required|string|max:60',
            'celular'   => 'nullable|string|max:8',
        ]);

        $cliente = Cliente::findOrFail($id);

        // Convertir fecha de d/m/Y a Y-m-d
        $fecha = '0000-00-00';
        if ($request->filled('fecha')) {
            try {
                $fecha = Carbon::createFromFormat('d/m/Y', $request->fecha)->format('Y-m-d');
            } catch (\Exception $e) {
                $fecha = '0000-00-00';
            }
        }

        $cliente->update([
            'fecha'         => $fecha,
            'nombre'        => Str::upper($request->nombre),
            'ci'            => $request->ci,
            'direccion'     => Str::upper($request->direccion),
            'ciudad'        => $request->cboCiudades ?? 0,
            'telefono'      => $request->telefono,
            'celular'       => $request->celular,
            'fax'           => $request->fax,
            'email'         => $request->email,
            'casilla'       => $request->casilla,
            'observaciones' => Str::upper($request->observaciones ?? ''),
            'sexo'          => $request->sexo,
            'estadocivil'   => $request->estadocivil,
        ]);

        // Seguimiento modificar
        $now = now('America/La_Paz');
        $max = DB::table('seguimiento')->max('no') + 1;
        DB::table('seguimiento')->insert([
            'no'       => $max,
            'id'       => $id,
            'tipomov'  => 2,
            'tipoid'   => 1,
            'ubicacion' => session('ubicacion_num', 1),
            'usuario'  => auth()->id(),
            'fecha'    => $now->format('Y-m-d'),
            'hora'     => $now->format('H:i:s'),
        ]);

        return redirect()->route('clientes.show', $id)
                         ->with('success', 'Datos del cliente modificados correctamente.');
    }
}