<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Request;
use App\Custom\SQLConnection;
use DB;

class NSEABMController extends Controller
{
    public function index(){

        $personas_j = [];
        $personas_f = [];
        
        $clientes = SQLConnection::backendStoreProcedure('LED_Clientes', array('SELECT', NULL, NULL, NULL, NULL, 0, env('PLATAFORMA')), 'select');
        
        $cifras =  DB::selectOne('ABM_nivel_soc ?,?,?', array('LISTAR_CIFRAS', NULL, NULL));

        $id_cliente = 0;
        return view('/abm-nse/nse')->with(compact('clientes','id_cliente','cifras'));
    }

    public function elegirCliente(){

        $id_cliente =  Request::input('clientes_se')??0;

        $personas_j = [];
        $personas_f = [];

        $cliente_elegido = DB::select('EXEC dbo.ABM_nivel_soc ?,?,?',array('LISTAR_CLIENTE',null,$id_cliente));

        foreach ($cliente_elegido as  $persona) {
            if ($persona->tipo_persona == "J" || $persona->tipo_persona == "j") {
                $personas_j[] = $persona; 
            } else if ($persona->tipo_persona == "F" || $persona->tipo_persona == "f") {
                $personas_f[] = $persona;
            }
        }

        return view('/abm-nse/nse_tablas')->with(compact('personas_j','personas_f','id_cliente'));
    }

    public function crearRango(){
        $userid = Session::get('usuario')->user_id;
        
        $min = Request::input('monto-minimo');
        $max = Request::input('monto-maximo');

        //dd($min,$max);
        $tipo_persona = Request::input('tipo-persona-select');
        $id_cliente = Request::input('id_cliente');

        $id_cliente = (int) $id_cliente;
        // Validamos que el ID del cliente no sea nulo
        $validacionCliente = $this->validarIdCliente($id_cliente);
        if ($validacionCliente) {
            return $validacionCliente;
        }

        $datos_cliente = DB::select('EXEC dbo.ABM_nivel_soc ?,?,?',array('LISTAR_CLIENTE',null,$id_cliente));
    
        $errorValidacionRango = $this->validarSuperposicionRango($min, $max, $tipo_persona, $datos_cliente);

        if ($errorValidacionRango) {
            return $errorValidacionRango;
        }

        // Si llegamos aquí, el rango es válido
        DB::select('EXEC dbo.ABM_nivel_soc ?,?,?,?,?,?,?', ['INSERTAR', null, $id_cliente, $tipo_persona, $min, $max, $userid]);
        $response = ["respuesta" => "Se cargó el nivel correctamente.", "status" => 200];

        return $response;
    }
    
    public function editarRango(){
        $userid = Session::get('usuario')->user_id;
        
        $min = Request::input('monto-minimo_edit');
        $max = Request::input('monto-maximo_edit');
        $id_cliente = Request::input('id_cliente_edit');
        $id_ingreso = Request::input('id_rango');
        $tipo_persona = Request::input('tipo_persona_edit');
        
        $id_cliente = (int) $id_cliente;
        // Validamos que el ID del cliente no sea nulo
        $validacionCliente = $this->validarIdCliente($id_cliente);
        if ($validacionCliente) {
            return $validacionCliente;
        }

        $datos_cliente = DB::select('EXEC dbo.ABM_nivel_soc ?,?,?',array('LISTAR_CLIENTE',null,$id_cliente));
        
        $errorValidacionRango = $this->validarSuperposicionRango($min, $max, $tipo_persona, $datos_cliente, $id_ingreso);

        if ($errorValidacionRango) {
            return $errorValidacionRango;
        }

        // Si llegamos aquí, el rango es válido
        DB::select('EXEC dbo.ABM_nivel_soc ?,?,?,?,?,?,?', ['ACTUALIZAR', $id_ingreso, null, null, $min, $max, $userid]);
        $response = ["respuesta" => "Se actualizó el nivel correctamente.", "status" => 200];

        return $response;
    }

    public function guardarRango(){
        $userid = Session::get('usuario')->user_id;

        //dd($min,$max);
        $directivo = Request::input('directivo');
        $socio = Request::input('socio');

        DB::select('EXEC dbo.ABM_nivel_soc ?,?,?,?,?,?,?,?,?',array('ACTUALIZAR_CIFRAS',NULL,NULL,NULL,NULL,NULL,$userid,$socio,$directivo));
        $response = ["respuesta"=>"Se cargo el nivel correctamente.","status"=>200];   
      
        
        return $response; 

        //
    }

    private function validarIdCliente($id_cliente) {
        if ( ($id_cliente !== 0) && (is_null($id_cliente) || empty($id_cliente)) ) {
            return [
                "respuesta" => "El ID del cliente es nulo o no se proporcionó.",
                "status" => 500
            ];
        }
        return null; // El ID del cliente es válido
    }

    private function validarSuperposicionRango(
        float $min,
        float $max,
        string $tipo_persona,
        array $rangos_existentes,
        ?int $id_rango_actual = null
    ): ?array {
        // 1. Validar que los montos no sean negativos
        if ($min < 0 || $max < 0) {
            return ["respuesta" => "Los montos no pueden ser negativos.", "status" => 500];
        }

        // 2. Validar que el mínimo no sea mayor que el máximo
        if ($min > $max) {
            return ["respuesta" => "El monto mínimo no puede ser mayor al monto máximo.", "status" => 500];
        }

        // 3. Validar superposición con rangos existentes
        foreach ($rangos_existentes as $rango_existente) {
            // Si estamos editando, y este es el mismo rango que estamos editando, lo saltamos.
            if ($id_rango_actual !== null && $rango_existente->id_ingreso == $id_rango_actual) {
                continue;
            }

            // Solo comparamos con rangos del mismo tipo de persona
            if (strtoupper($tipo_persona) == strtoupper($rango_existente->tipo_persona)) {
                // Comprobamos superposición:
                // Un rango [a, b] se superpone con [c, d] si (a <= d && b >= c)
                $seSuperponen = ($min <= $rango_existente->monto_maximo && $max >= $rango_existente->monto_minimo);

                if ($seSuperponen) {
                    $mensajeError = $id_rango_actual !== null ?
                        "Los montos no pueden estar dentro de otros niveles socio-económicos." :
                        "Los montos no pueden estar incluidos en otros niveles.";
                    return ["respuesta" => $mensajeError, "status" => 500];
                }
            }
        }

        return null; // El rango es válido
    }
}
