CREATE OR REPLACE FUNCTION nethive.fn_topologia_por_negocio(p_negocio_id uuid)
RETURNS jsonb
LANGUAGE plpgsql
AS $$
BEGIN
  RETURN (
    SELECT jsonb_build_object(
      'componentes', (
        SELECT jsonb_agg(row_to_json(c))
        FROM (
          SELECT
            comp.id,
            comp.nombre,
            comp.categoria_id,
            cat.nombre AS categoria,
            comp.rol_logico_id,
            r.nombre AS rol_logico,
            comp.descripcion,
            comp.ubicacion,
            comp.imagen_url,
            comp.en_uso,
            comp.activo,
            comp.fecha_registro,
            comp.distribucion_id,
            td.nombre AS tipo_distribucion,
            d.nombre AS nombre_distribucion
          FROM nethive.componente comp
          LEFT JOIN nethive.categoria_componente cat ON comp.categoria_id = cat.id
          LEFT JOIN nethive.rol_logico_componente r ON comp.rol_logico_id = r.id
          LEFT JOIN nethive.distribucion d ON comp.distribucion_id = d.id
          LEFT JOIN nethive.tipo_distribucion td ON d.tipo_id = td.id
          WHERE comp.negocio_id = p_negocio_id
        ) AS c
      ),

      'conexiones_datos', (
        SELECT jsonb_agg(row_to_json(cd))
        FROM (
          SELECT
            cc.id,
            cc.componente_origen_id,
            co.nombre AS nombre_origen,
            ro.id AS rol_logico_origen_id,
            ro.nombre AS rol_logico_origen,
            cc.componente_destino_id,
            cd.nombre AS nombre_destino,
            rd.id AS rol_logico_destino_id,
            rd.nombre AS rol_logico_destino,
            cc.cable_id,
            cb.nombre AS nombre_cable,
            cc.descripcion,
            cc.activo
          FROM nethive.conexion_componente cc
          LEFT JOIN nethive.componente co ON cc.componente_origen_id = co.id
          LEFT JOIN nethive.rol_logico_componente ro ON co.rol_logico_id = ro.id
          LEFT JOIN nethive.componente cd ON cc.componente_destino_id = cd.id
          LEFT JOIN nethive.rol_logico_componente rd ON cd.rol_logico_id = rd.id
          LEFT JOIN nethive.componente cb ON cc.cable_id = cb.id
          WHERE co.negocio_id = p_negocio_id OR cd.negocio_id = p_negocio_id
        ) AS cd
      ),

      'conexiones_energia', (
        SELECT jsonb_agg(row_to_json(ce))
        FROM (
          SELECT
            ca.id,
            ca.origen_id,
            co.nombre AS nombre_origen,
            ro.id AS rol_logico_origen_id,
            ro.nombre AS rol_logico_origen,
            ca.destino_id,
            cd.nombre AS nombre_destino,
            rd.id AS rol_logico_destino_id,
            rd.nombre AS rol_logico_destino,
            ca.cable_id,
            cb.nombre AS nombre_cable,
            ca.descripcion,
            ca.activo
          FROM nethive.conexion_alimentacion ca
          LEFT JOIN nethive.componente co ON ca.origen_id = co.id
          LEFT JOIN nethive.rol_logico_componente ro ON co.rol_logico_id = ro.id
          LEFT JOIN nethive.componente cd ON ca.destino_id = cd.id
          LEFT JOIN nethive.rol_logico_componente rd ON cd.rol_logico_id = rd.id
          LEFT JOIN nethive.componente cb ON ca.cable_id = cb.id
          WHERE co.negocio_id = p_negocio_id OR cd.negocio_id = p_negocio_id
        ) AS ce
      )
    )
  );
END;
$$;
