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

<cfscript>
response = { "OK": false, "steps": [] };

try {
    lazyDaisyID = 37;

    // Get all beacons
    qBeacons = queryTimed("SELECT ID, UUID FROM Beacons", {}, { datasource: "payfrit" });
    response.steps.append("Found " & qBeacons.recordCount & " beacons");

    // Create service point for Table 1 if it doesn't exist
    qSP = queryTimed("
        SELECT ID FROM ServicePoints
        WHERE BusinessID = :bizID AND Name = 'Table 1'
    ", { bizID: lazyDaisyID }, { datasource: "payfrit" });

    if (qSP.recordCount == 0) {
        queryTimed("
            INSERT INTO ServicePoints (BusinessID, Name)
            VALUES (:bizID, 'Table 1')
        ", { bizID: lazyDaisyID }, { datasource: "payfrit" });
        qSP = queryTimed("SELECT LAST_INSERT_ID() as id", {}, { datasource: "payfrit" });
        servicePointID = qSP.id;
        response.steps.append("Created service point 'Table 1' (ID: " & servicePointID & ")");
    } else {
        servicePointID = qSP.ID;
        response.steps.append("Found existing service point 'Table 1' (ID: " & servicePointID & ")");
    }

    // Assign all beacons to the Table 1 service point
    for (i = 1; i <= qBeacons.recordCount; i++) {
        beaconID = qBeacons.ID[i];

        // Unassign this beacon from any other service point first
        queryTimed("
            UPDATE ServicePoints SET BeaconID = NULL, AssignedByUserID = NULL
            WHERE BeaconID = :beaconID
        ", { beaconID: beaconID }, { datasource: "payfrit" });

        // Assign beacon to Table 1 service point
        queryTimed("
            UPDATE ServicePoints SET BeaconID = :beaconID, AssignedByUserID = 1
            WHERE ID = :spID AND BusinessID = :bizID
        ", { beaconID: beaconID, bizID: lazyDaisyID, spID: servicePointID }, { datasource: "payfrit" });
        response.steps.append("Assigned beacon " & beaconID & " to Table 1");
    }

    // Get final status
    qFinal = queryTimed("
        SELECT sp.ID AS ServicePointID, sp.BeaconID, sp.BusinessID AS BusinessID,
               b.Name AS BeaconName, b.UUID, sp.Name AS ServicePointName,
               biz.Name AS BusinessName
        FROM ServicePoints sp
        JOIN Beacons b ON b.ID = sp.BeaconID
        JOIN Businesses biz ON biz.ID = sp.BusinessID
        WHERE sp.BeaconID IS NOT NULL
    ", {}, { datasource: "payfrit" });

    beacons = [];
    for (i = 1; i <= qFinal.recordCount; i++) {
        arrayAppend(beacons, {
            "BeaconID": qFinal.BeaconID[i],
            "UUID": qFinal.UUID[i],
            "BusinessID": qFinal.BusinessID[i],
            "BusinessName": qFinal.BusinessName[i],
            "ServicePointID": qFinal.ServicePointID[i],
            "ServicePointName": qFinal.ServicePointName[i]
        });
    }

    response.OK = true;
    response.beacons = beacons;

} catch (any e) {
    response.error = e.message;
    if (len(e.detail)) {
        response.detail = e.detail;
    }
}

writeOutput(serializeJSON(response));
</cfscript>
