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

<cfscript>
// Check for action parameter
data = {};
try {
  rawContent = getHttpRequestData().content;
  if (len(trim(rawContent))) data = deserializeJSON(rawContent);
} catch (any e) {}

// Close all open chats action
if (structKeyExists(data, "action") && data.action == "closeAllChats") {
  queryExecute("
    UPDATE Tasks SET CompletedOn = NOW()
    WHERE TaskTypeID = 2 AND CompletedOn IS NULL
  ", {}, { datasource: "payfrit" });
  writeOutput(serializeJSON({ "OK": true, "MESSAGE": "All open chats closed" }));
  abort;
}
</cfscript>

<cftry>
  <cfset qTasks = queryExecute("
    SELECT
      t.ID,
      t.BusinessID,
      t.OrderID,
      t.ClaimedByUserID,
      t.ClaimedOn,
      t.CompletedOn,
      o.StatusID
    FROM Tasks t
    LEFT JOIN Orders o ON o.ID = t.OrderID
    ORDER BY t.ID DESC
    LIMIT 20
  ", [], { datasource = "payfrit" })>

  <cfset tasks = []>
  <cfloop query="qTasks">
    <cfset arrayAppend(tasks, {
      "TaskID": qTasks.ID,
      "BusinessID": qTasks.BusinessID,
      "OrderID": qTasks.OrderID,
      "ClaimedByUserID": qTasks.ClaimedByUserID,
      "ClaimedOn": isNull(qTasks.ClaimedOn) ? "NULL" : dateTimeFormat(qTasks.ClaimedOn, "yyyy-mm-dd HH:nn:ss"),
      "CompletedOn": isNull(qTasks.CompletedOn) ? "NULL" : dateTimeFormat(qTasks.CompletedOn, "yyyy-mm-dd HH:nn:ss"),
      "StatusID": isNull(qTasks.StatusID) ? "NULL" : qTasks.StatusID
    })>
  </cfloop>

  <cfset qStats = queryExecute("
    SELECT
      COUNT(*) as Total,
      SUM(CASE WHEN ClaimedByUserID > 0 AND CompletedOn IS NULL THEN 1 ELSE 0 END) as ClaimedNotCompleted,
      SUM(CASE WHEN ClaimedByUserID = 0 OR ClaimedByUserID IS NULL THEN 1 ELSE 0 END) as Unclaimed,
      SUM(CASE WHEN CompletedOn IS NOT NULL THEN 1 ELSE 0 END) as Completed
    FROM Tasks
  ", [], { datasource = "payfrit" })>

  <cfoutput>#serializeJSON({
    "OK": true,
    "TASKS": tasks,
    "STATS": {
      "Total": qStats.Total,
      "ClaimedNotCompleted": qStats.ClaimedNotCompleted,
      "Unclaimed": qStats.Unclaimed,
      "Completed": qStats.Completed
    }
  })#</cfoutput>

  <cfcatch>
    <cfoutput>#serializeJSON({
      "OK": false,
      "ERROR": cfcatch.message,
      "DETAIL": cfcatch.detail
    })#</cfoutput>
  </cfcatch>
</cftry>
