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

<cffunction name="readJsonBody" access="public" returntype="struct" output="false">
  <cfset var raw = getHttpRequestData().content>
  <cfif isNull(raw) OR len(trim(raw)) EQ 0>
    <cfreturn {}>
  </cfif>
  <cftry>
    <cfset var data = deserializeJSON(raw)>
    <cfif isStruct(data)>
      <cfreturn data>
    <cfelse>
      <cfreturn {}>
    </cfif>
    <cfcatch>
      <cfreturn {}>
    </cfcatch>
  </cftry>
</cffunction>

<cffunction name="apiAbort" access="public" returntype="void" output="true">
  <cfargument name="payload" type="struct" required="true">
  <cfcontent type="application/json; charset=utf-8">
  <cfoutput>#serializeJSON(arguments.payload)#</cfoutput>
  <cfabort>
</cffunction>

<cfset data = readJsonBody()>
<cfset BusinessID = val( structKeyExists(data,"BusinessID") ? data.BusinessID : 0 )>
<cfset Assignments = structKeyExists(data,"Assignments") ? data.Assignments : []>

<cfif BusinessID LTE 0>
  <cfset apiAbort({ "OK": false, "ERROR": "missing_businessid", "MESSAGE": "BusinessID is required." })>
</cfif>

<cftry>
  <cfset updateCount = 0>

  <!--- First, clear all station assignments for items in this business --->
  <!--- Support both unified schema (BusinessID) and legacy (via Categories) --->
  <cfset queryTimed("
    UPDATE Items
    SET StationID = NULL
    WHERE BusinessID = ?
  ", [ { value = BusinessID, cfsqltype = "cf_sql_integer" } ], { datasource = "payfrit" })>

  <!--- Then apply the new assignments --->
  <cfloop array="#Assignments#" index="assignment">
    <cfif structKeyExists(assignment, "ItemID") AND structKeyExists(assignment, "StationID")>
      <cfset queryTimed("
        UPDATE Items
        SET StationID = ?
        WHERE ID = ?
      ", [
        { value = assignment.StationID, cfsqltype = "cf_sql_integer" },
        { value = assignment.ItemID, cfsqltype = "cf_sql_integer" }
      ], { datasource = "payfrit" })>
      <cfset updateCount++>
    </cfif>
  </cfloop>

  <cfset apiAbort({
    "OK": true,
    "ERROR": "",
    "MESSAGE": "Station assignments updated",
    "UPDATED_COUNT": updateCount
  })>

  <cfcatch>
    <cfset apiAbort({
      "OK": false,
      "ERROR": "server_error",
      "MESSAGE": "Error updating stations",
      "DETAIL": cfcatch.message
    })>
  </cfcatch>
</cftry>
