<?php

namespace App\Http\Controllers;

use App\Models\Conexion;
use App\Models\Cliente;
use App\Models\Terreno;
use App\Models\Medidor;
use App\Models\CategoriaTarifa;
use App\Models\Via;
use App\Models\Sector;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Maatwebsite\Excel\Facades\Excel;
use App\Imports\ConexionImport;
class ConexionController extends Controller
{
   public function index()
{
    // Clientes únicos con TODAS sus conexiones y subrelaciones
    $clientes = Cliente::whereHas('conexiones') // solo los que tienen al menos una conexión
    ->with([
        'conexiones.medidor',
        'conexiones.categoriaTarifa',
        'conexiones.via.sector',
    ])
    ->get();


    // Catálogos para selects/modales en la vista
    $medidores        = Medidor::select('id_medidor','numero_serie')->get();
    $vias             = Via::with('sector')->get();   // ✅ cambiamos a sector
    $categoriasTarifa = CategoriaTarifa::select('id_categoria_tarifa','nombre_categoria')->get();
    $sectores         = Sector::select('id_sector','nombre_sector')->get();

    return view('conexion.index', compact(
        'clientes',
        'medidores',
        'vias',
        'categoriasTarifa',
        'sectores'
    ));
}

   public function store(Request $request)
{
    $validated = $request->validate([
        'id_cliente' => 'required|exists:cliente,id_cliente',
        'id_via' => 'required|exists:via,id_via',
        'id_medidor' => 'nullable|exists:medidor,id_medidor',
        'id_categoria_tarifa' => 'required|exists:categoria_tarifa,id_categoria_tarifa',
    ]);

    if (isset($validated['id_medidor'])) {
        $existeMedidor = Conexion::where('id_medidor', $validated['id_medidor'])->exists();
        if ($existeMedidor) {
            return response()->json([
                'message' => '❌ El medidor seleccionado ya está asociado a otra conexión.'
            ], 422);
        }
    }

    $conexionData = [
        'id_cliente' => $validated['id_cliente'],
        'id_via' => $validated['id_via'],
        'id_categoria_tarifa' => $validated['id_categoria_tarifa'],
        'estado' => 'Activo',
        'fecha_instalacion' => now(),
    ];

    if (isset($validated['id_medidor'])) {
        $conexionData['id_medidor'] = $validated['id_medidor'];
    }

    $conexion = Conexion::create($conexionData);

    return response()->json([
        'message' => '✅ Conexión registrada correctamente.',
        'id_conexion' => $conexion->id_conexion
    ], 201);
}





    public function update(Request $request, $id)
{
    $conexion = Conexion::findOrFail($id);

    $validated = $request->validate([
        'id_cliente' => 'required|exists:cliente,id_cliente',
        'id_via' => 'required|exists:via,id_via',
        'id_medidor' => 'nullable|exists:medidor,id_medidor', // <== Opcional
        'id_categoria_tarifa' => 'required|exists:categoria_tarifa,id_categoria_tarifa',
        'fecha_instalacion' => 'required|date',
        'estado' => 'required|in:Activo,Suspendido,Cortado'
    ]);

    // Verificar que el medidor no esté asignado a otra conexión
    $existeMedidor = Conexion::where('id_medidor', $validated['id_medidor'])
        ->where('id_conexion', '!=', $conexion->id_conexion)
        ->exists();

    if ($existeMedidor) {
        return response()->json([
            'message' => '❌ El medidor seleccionado ya está asociado a otra conexión.'
        ], 422);
    }

    $conexion->update($validated);

    return response()->json([
        'message' => '✅ Conexión actualizada correctamente.',
        'id_conexion' => $conexion->id_conexion
    ]);
}


    public function destroy($id)
    {
        $conexion = Conexion::findOrFail($id);
        $conexion->delete();

        return response()->json(['message' => 'Conexión eliminada correctamente.']);
    }

    public function importarExcel(Request $request)
{
    $request->validate([
        'archivo' => 'required|file|mimes:xlsx,xls'
    ]);

    try {

        $import = new ConexionImport();
        Excel::import($import, $request->file('archivo'));

        return response()->json([
            'success' => true,
            'importados' => $import->importados,
            'errores' => count($import->errores),
            'detalle_errores' => $import->errores // opcional
        ]);

    } catch (\Exception $e) {

        return response()->json([
            'success' => false,
            'message' => 'Error al procesar el archivo: ' . $e->getMessage()
        ], 500);
    }
}

}
