<cfsetting showdebugoutput="false">
<cfsetting enablecfoutputonly="true">
<cfcontent type="application/json; charset=utf-8" reset="true">

<cfscript>
/*
  Clean up duplicate employee records for a business
  POST: { "BusinessID": 17 }
*/

function apiAbort(required struct payload) {
  writeOutput(serializeJSON(payload));
  abort;
}

function readJsonBody() {
  var raw = getHttpRequestData().content;
  if (isNull(raw)) raw = "";
  if (!len(trim(raw))) return {};
  try {
    var data = deserializeJSON(raw);
    if (isStruct(data)) return data;
  } catch (any e) {}
  return {};
}

data = readJsonBody();
businessId = structKeyExists(data, "BusinessID") ? val(data.BusinessID) : 0;

if (businessId <= 0) {
  apiAbort({ "OK": false, "ERROR": "BusinessID required" });
}

try {
  // Find duplicate UserIDs for this business (keep the one with highest status or oldest)
  qDupes = queryExecute("
    SELECT ID, COUNT(*) as cnt, MIN(ID) as keepId
    FROM Employees
    WHERE BusinessID = ?
    GROUP BY UserID
    HAVING COUNT(*) > 1
  ", [{ value: businessId, cfsqltype: "cf_sql_integer" }], { datasource: "payfrit" });

  deleted = 0;
  for (row in qDupes) {
    // Delete all but the one we want to keep (the one with lowest EmployeeID)
    qDel = queryExecute("
      DELETE FROM Employees
      WHERE BusinessID = ? AND UserID = ? AND ID != ?
    ", [
      { value: businessId, cfsqltype: "cf_sql_integer" },
      { value: row.UserID, cfsqltype: "cf_sql_integer" },
      { value: row.keepId, cfsqltype: "cf_sql_integer" }
    ], { datasource: "payfrit" });
    deleted += (row.cnt - 1);
  }

  // Get remaining employees
  qRemaining = queryExecute("
    SELECT e.ID, e.UserID, u.FirstName, u.LastName
    FROM Employees e
    JOIN Users u ON e.UserID = u.ID
    WHERE e.BusinessID = ?
    ORDER BY e.ID
  ", [{ value: businessId, cfsqltype: "cf_sql_integer" }], { datasource: "payfrit" });

  remaining = [];
  for (r in qRemaining) {
    arrayAppend(remaining, {
      "EmployeeID": r.ID,
      "UserID": r.UserID,
      "Name": trim(r.FirstName & " " & r.LastName)
    });
  }

  writeOutput(serializeJSON({
    "OK": true,
    "DUPLICATES_FOUND": qDupes.recordCount,
    "DELETED": deleted,
    "REMAINING": remaining
  }));

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