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

<cfscript>
// Returns scheduled task definitions for a business
// Input: BusinessID (required)
// Output: { OK: true, SCHEDULED_TASKS: [...] }

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 {};
}

try {
    data = readJsonBody();

    // Get BusinessID from body, header, or URL
    businessID = 0;
    httpHeaders = getHttpRequestData().headers;

    if (structKeyExists(data, "BusinessID") && isNumeric(data.BusinessID)) {
        businessID = int(data.BusinessID);
    } else if (structKeyExists(httpHeaders, "X-Business-ID") && isNumeric(httpHeaders["X-Business-ID"])) {
        businessID = int(httpHeaders["X-Business-ID"]);
    } else if (structKeyExists(url, "BusinessID") && isNumeric(url.BusinessID)) {
        businessID = int(url.BusinessID);
    }

    if (businessID == 0) {
        apiAbort({ "OK": false, "ERROR": "missing_params", "MESSAGE": "BusinessID is required" });
    }

    // Get scheduled task definitions for this business
    q = queryExecute("
        SELECT
            st.ID,
            st.Name as Name,
            st.TaskCategoryID as CategoryID,
            st.Title as Title,
            st.Details as Details,
            st.CronExpression as CronExpression,
            COALESCE(st.ScheduleType, 'cron') as ScheduleType,
            st.IntervalMinutes as IntervalMinutes,
            st.IsActive as IsActive,
            st.LastRunOn as LastRunOn,
            st.NextRunOn as NextRunOn,
            st.CreatedOn as CreatedOn,
            tc.Name as Name,
            tc.Color as CategoryColor
        FROM ScheduledTaskDefinitions st
        LEFT JOIN TaskCategories tc ON st.TaskCategoryID = tc.ID
        WHERE st.BusinessID = :businessID
        ORDER BY st.IsActive DESC, st.Name
    ", {
        businessID: { value: businessID, cfsqltype: "cf_sql_integer" }
    }, { datasource: "payfrit" });

    scheduledTasks = [];
    for (row in q) {
        arrayAppend(scheduledTasks, {
            "ScheduledTaskID": row.ID,
            "Name": row.Name,
            "CategoryID": isNull(row.CategoryID) ? "" : row.CategoryID,
            "Title": row.Title,
            "Details": isNull(row.Details) ? "" : row.Details,
            "CronExpression": row.CronExpression,
            "ScheduleType": row.ScheduleType,
            "IntervalMinutes": isNull(row.IntervalMinutes) ? "" : row.IntervalMinutes,
            "IsActive": row.IsActive ? true : false,
            "LastRunOn": isNull(row.LastRunOn) ? "" : dateTimeFormat(row.LastRunOn, "yyyy-mm-dd HH:nn:ss"),
            "NextRunOn": isNull(row.NextRunOn) ? "" : dateTimeFormat(row.NextRunOn, "yyyy-mm-dd HH:nn:ss"),
            "CreatedOn": dateTimeFormat(row.CreatedOn, "yyyy-mm-dd HH:nn:ss"),
            "Name": isNull(row.Name) ? "" : row.Name,
            "CategoryColor": isNull(row.CategoryColor) ? "" : row.CategoryColor
        });
    }

    apiAbort({
        "OK": true,
        "SCHEDULED_TASKS": scheduledTasks,
        "COUNT": arrayLen(scheduledTasks)
    });

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