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

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

<cfscript>
function readJsonBody() {
  raw = toString(getHttpRequestData().content);
  if (isNull(raw) || len(trim(raw)) EQ 0) return {};
  try {
    parsed = deserializeJSON(raw);
  } catch(any e) {
    apiAbort({ OK=false, ERROR="bad_json", MESSAGE="Invalid JSON body" });
  }
  if (!isStruct(parsed)) return {};
  return parsed;
}

// Support GET param or POST body
parentBusinessId = 0;
if (structKeyExists(url, "BusinessID") && isNumeric(url.BusinessID)) {
  parentBusinessId = int(url.BusinessID);
} else {
  data = readJsonBody();
  if (structKeyExists(data, "BusinessID") && isNumeric(data.BusinessID)) {
    parentBusinessId = int(data.BusinessID);
  }
}

if (parentBusinessId LTE 0) {
  apiAbort({ OK=false, ERROR="missing_business_id", MESSAGE="BusinessID is required" });
}

try {
  q = queryExecute(
    "
      SELECT
        ID,
        Name
      FROM Businesses
      WHERE ParentBusinessID = :parentId
      ORDER BY Name
    ",
    { parentId = { value = parentBusinessId, cfsqltype = "cf_sql_integer" } },
    { datasource = "payfrit" }
  );

  rows = [];
  for (i = 1; i <= q.recordCount; i++) {
    arrayAppend(rows, {
      "BusinessID": q.ID[i],
      "Name": q.Name[i]
    });
  }

  writeOutput(serializeJSON({
    "OK": true,
    "ERROR": "",
    "BUSINESSES": rows
  }));
  abort;

} catch (any e) {
  apiAbort({
    "OK": false,
    "ERROR": "server_error",
    "DETAIL": e.message
  });
}
</cfscript>
