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

<cfscript>
/**
 * Setup Lazy Daisy Beacons
 * Creates a beacon for each service point and assigns them
 */
response = { "OK": false, "steps": [] };

try {
    lazyDaisyID = 37;

    // Get all service points for Lazy Daisy
    qServicePoints = queryExecute("
        SELECT ID, Name AS Name
        FROM ServicePoints
        WHERE BusinessID = :bizID AND IsActive = 1
        ORDER BY SortOrder, ID
    ", { bizID: lazyDaisyID }, { datasource: "payfrit" });

    response.steps.append("Found " & qServicePoints.recordCount & " service points for Lazy Daisy");

    // Create a beacon for each service point
    beaconsCreated = 0;
    for (sp in qServicePoints) {
        beaconName = "Beacon - " & sp.Name;

        // Check if beacon already exists for this business with this name
        qExisting = queryExecute("
            SELECT ID FROM Beacons
            WHERE BusinessID = :bizId AND Name = :name
        ", { bizId: lazyDaisyID, name: beaconName }, { datasource: "payfrit" });

        if (qExisting.recordCount == 0) {
            // Generate a unique UUID for this beacon (32 hex chars, no dashes)
            beaconUUID = "PAYFRIT00037" & numberFormat(sp.ID, "0000000000000000000");

            queryExecute("
                INSERT INTO Beacons (BusinessID, Name, UUID, IsActive)
                VALUES (:bizId, :name, :uuid, 1)
            ", {
                bizId: lazyDaisyID,
                name: beaconName,
                uuid: beaconUUID
            }, { datasource: "payfrit" });

            qNewBeacon = queryExecute("SELECT LAST_INSERT_ID() as id", {}, { datasource: "payfrit" });
            newBeaconId = qNewBeacon.id;

            // Assign beacon directly to service point
            queryExecute("
                UPDATE ServicePoints
                SET BeaconID = :beaconId, AssignedByUserID = 1
                WHERE ID = :spId AND BusinessID = :bizId
            ", {
                beaconId: newBeaconId,
                bizId: lazyDaisyID,
                spId: sp.ID
            }, { datasource: "payfrit" });

            response.steps.append("Created beacon '" & beaconName & "' (ID: " & newBeaconId & ") -> " & sp.Name);
            beaconsCreated++;
        } else {
            response.steps.append("Beacon '" & beaconName & "' already exists, skipping");
        }
    }

    // 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.BusinessID = :bizId AND sp.BeaconID IS NOT NULL
        ORDER BY sp.Name
    ", { bizId: lazyDaisyID }, { datasource: "payfrit" });

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

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

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

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