<cfsetting showdebugoutput="false">
<cfsetting enablecfoutputonly="true">

<cfcontent type="application/json; charset=utf-8" reset="true">
<cfheader name="Cache-Control" value="no-store">

<cfscript>
function apiAbort(obj) {
  writeOutput(serializeJSON(obj));
  abort;
}

// Read JSON body once
data = {};
try {
  raw = toString(getHttpRequestData().content);
  if (len(trim(raw))) {
    data = deserializeJSON(raw);
    if (!isStruct(data)) data = {};
  }
} catch (any e) {
  data = {};
}

httpHeaders = getHttpRequestData().headers;

// Get BusinessID from: session > body > X-Business-ID header > URL
bizId = 0;
if (structKeyExists(request, "BusinessID") && isNumeric(request.BusinessID) && request.BusinessID GT 0) {
  bizId = int(request.BusinessID);
}
if (bizId LTE 0 && structKeyExists(data, "BusinessID") && isNumeric(data.BusinessID) && data.BusinessID GT 0) {
  bizId = int(data.BusinessID);
}
if (bizId LTE 0 && structKeyExists(httpHeaders, "X-Business-ID") && isNumeric(httpHeaders["X-Business-ID"]) && httpHeaders["X-Business-ID"] GT 0) {
  bizId = int(httpHeaders["X-Business-ID"]);
}
if (bizId LTE 0 && structKeyExists(url, "BusinessID") && isNumeric(url.BusinessID) && url.BusinessID GT 0) {
  bizId = int(url.BusinessID);
}
if (bizId LTE 0) {
  apiAbort({ OK=false, ERROR="no_business_selected" });
}

// Default behavior: only active beacons unless onlyActive is explicitly false/0
onlyActive = true;
if (structKeyExists(data, "onlyActive")) {
  if (isBoolean(data.onlyActive)) {
    onlyActive = data.onlyActive;
  } else if (isNumeric(data.onlyActive)) {
    onlyActive = (int(data.onlyActive) EQ 1);
  } else if (isSimpleValue(data.onlyActive)) {
    onlyActive = (lcase(trim(toString(data.onlyActive))) EQ "true");
  }
}
</cfscript>

<cfquery name="q" datasource="payfrit">
  SELECT DISTINCT
    b.ID,
    b.BusinessID,
    b.Name,
    b.UUID,
    b.IsActive
  FROM Beacons b
  WHERE (
    b.BusinessID = <cfqueryparam cfsqltype="cf_sql_integer" value="#bizId#">
    OR b.ID IN (
      SELECT lt.BeaconID FROM lt_BeaconsID_BusinessesID lt
      WHERE lt.BusinessID = <cfqueryparam cfsqltype="cf_sql_integer" value="#bizId#">
    )
  )
  <cfif onlyActive>
    AND b.IsActive = 1
  </cfif>
  ORDER BY b.Name, b.ID
</cfquery>

<cfset beacons = []>
<cfloop query="q">
  <cfset arrayAppend(beacons, {
    "BeaconID"    = q.ID,
    "BusinessID"  = q.BusinessID,
    "Name"  = q.Name,
    "UUID"        = q.UUID,
    "IsActive"    = q.IsActive
  })>
</cfloop>

<cfscript>try{logPerf(0);}catch(any e){}</cfscript>
<cfoutput>#serializeJSON({ OK=true, ERROR="", BusinessID=bizId, COUNT=arrayLen(beacons), BEACONS=beacons })#</cfoutput>
