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

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

try {
    lazyDaisyID = 37;

    // The three beacon UUIDs we need
    beaconUUIDs = [
        "626C7565636861726D31000000000001",
        "1B6295D54F744C58A2D8CD83CA26BDF4",
        "7777772E6B6B6D636E2E636F6D000001"
    ];

    // Create beacons
    for (i = 1; i <= arrayLen(beaconUUIDs); i++) {
        uuid = beaconUUIDs[i];

        // Check if beacon exists
        qB = queryExecute("SELECT ID FROM Beacons WHERE UUID = :uuid", { uuid: uuid }, { datasource: "payfrit" });

        if (qB.recordCount == 0) {
            queryExecute("INSERT INTO Beacons (UUID, BusinessID) VALUES (:uuid, :bizID)", { uuid: uuid, bizID: lazyDaisyID }, { datasource: "payfrit" });
            qNew = queryExecute("SELECT LAST_INSERT_ID() as id", {}, { datasource: "payfrit" });
            beaconID = qNew.id;
            response.steps.append("Created beacon " & beaconID & " with UUID: " & uuid);
        } else {
            beaconID = qB.ID;
            response.steps.append("Beacon exists: " & beaconID & " with UUID: " & uuid);
        }
    }

    // Get service point Table 1
    qSP = queryExecute("
        SELECT ID FROM ServicePoints
        WHERE BusinessID = :bizID AND Name = 'Table 1'
    ", { bizID: lazyDaisyID }, { datasource: "payfrit" });

    if (qSP.recordCount == 0) {
        queryExecute("
            INSERT INTO ServicePoints (BusinessID, Name)
            VALUES (:bizID, 'Table 1')
        ", { bizID: lazyDaisyID }, { datasource: "payfrit" });
        qSP = queryExecute("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 service point 'Table 1' (ID: " & servicePointID & ")");
    }

    // Assign all beacons to the Table 1 service point
    qBeacons = queryExecute("SELECT ID, UUID FROM Beacons WHERE BusinessID = :bizID", { bizID: lazyDaisyID }, { datasource: "payfrit" });

    for (i = 1; i <= qBeacons.recordCount; i++) {
        beaconID = qBeacons.ID[i];

        // Unassign this beacon from any existing service point
        queryExecute("
            UPDATE ServicePoints SET BeaconID = NULL, AssignedByUserID = NULL
            WHERE BeaconID = :beaconID

        ", { beaconID: beaconID }, { datasource: "payfrit" });

        // Assign beacon to Table 1 service point
        queryExecute("
            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 = queryExecute("
        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>
