<cfscript>
/**
 * Check Stripe Connect Status
 * Returns the current status of a business's Stripe account
 *
 * POST: { BusinessID: int }
 * Returns: { OK: true, CONNECTED: bool, ACCOUNT_STATUS: string, ... }
 */

response = { "OK": false };

try {
    requestData = deserializeJSON(toString(getHttpRequestData().content));
    businessID = val(requestData.BusinessID ?: 0);

    if (businessID == 0) {
        response["ERROR"] = "BusinessID is required";
        writeOutput(serializeJSON(response));
        abort;
    }

    stripeSecretKey = application.stripeSecretKey ?: "";

    // Get business Stripe info
    qBusiness = queryTimed("
        SELECT StripeAccountID AS BusinessStripeAccountID, StripeOnboardingComplete AS BusinessStripeOnboardingComplete
        FROM Businesses
        WHERE ID = :businessID
    ", { businessID: businessID });

    if (qBusiness.recordCount == 0) {
        response["ERROR"] = "Business not found";
        writeOutput(serializeJSON(response));
        abort;
    }

    stripeAccountID = qBusiness.BusinessStripeAccountID;

    if (stripeAccountID == "" || isNull(stripeAccountID)) {
        response["OK"] = true;
        response["CONNECTED"] = false;
        response["ACCOUNT_STATUS"] = "not_started";
        writeOutput(serializeJSON(response));
        abort;
    }

    // Retrieve account from Stripe to check status
    if (stripeSecretKey != "") {
        httpService = new http();
        httpService.setMethod("GET");
        httpService.setUrl("https://api.stripe.com/v1/accounts/#stripeAccountID#");
        httpService.setUsername(stripeSecretKey);
        httpService.setPassword("");

        result = httpService.send().getPrefix();
        accountData = deserializeJSON(result.fileContent);

        if (structKeyExists(accountData, "error")) {
            response["OK"] = true;
            response["CONNECTED"] = false;
            response["ACCOUNT_STATUS"] = "error";
            response["ERROR_DETAIL"] = accountData.error.message;
            writeOutput(serializeJSON(response));
            abort;
        }

        // Check if onboarding is complete
        chargesEnabled = accountData.charges_enabled ?: false;
        payoutsEnabled = accountData.payouts_enabled ?: false;
        detailsSubmitted = accountData.details_submitted ?: false;

        if (chargesEnabled && payoutsEnabled) {
            accountStatus = "active";

            // Mark as complete in database if not already
            if (!qBusiness.BusinessStripeOnboardingComplete) {
                queryTimed("
                    UPDATE Businesses
                    SET StripeOnboardingComplete = 1
                    WHERE ID = :businessID
                ", { businessID: businessID });
            }
        } else if (detailsSubmitted) {
            accountStatus = "pending_verification";
        } else {
            accountStatus = "incomplete";
        }

        response["OK"] = true;
        response["CONNECTED"] = chargesEnabled && payoutsEnabled;
        response["ACCOUNT_STATUS"] = accountStatus;
        response["STRIPE_ACCOUNT_ID"] = stripeAccountID;
        response["CHARGES_ENABLED"] = chargesEnabled;
        response["PAYOUTS_ENABLED"] = payoutsEnabled;
        response["DETAILS_SUBMITTED"] = detailsSubmitted;
    } else {
        // No Stripe key, just return what we have in DB
        response["OK"] = true;
        response["CONNECTED"] = qBusiness.BusinessStripeOnboardingComplete == 1;
        response["ACCOUNT_STATUS"] = qBusiness.BusinessStripeOnboardingComplete == 1 ? "active" : "unknown";
        response["STRIPE_ACCOUNT_ID"] = stripeAccountID;
    }

} catch (any e) {
    response["ERROR"] = e.message;
}

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