<?php
    http_response_code(200);
    
date_default_timezone_set('America/Denver');
    require_once 'test_utility_stripe_database2026.php';
    require_once "KLogger.php";
    
    $dbObject = new MySQLDB;
    $myLogger = new KLogger(STRIPE_LOG_FILE_CHARGE, KLogger::DEBUG);
    require_once STRIPE_INIT_LOCATION;
        
\Stripe\Stripe::setApiKey(STRIPE_SECRET_KEY);

$handled=false;
// Retrieve the request's body and parse it as JSON
$body = @file_get_contents('php://input');
$event_json = json_decode($body);

$myLogger->logDebug(" event : ".$event_json->type);    
//$myLogger->logDebug(" event : ".print_r($event_json,true));    
//the events handled here always include a charge object
$eventType = $event_json->type;
$chargeObject = $event_json->data->object;
$chargeID = $chargeObject->id;
$chargeDate = $chargeObject->created;
$tempDate = date("Y-m-d H:i:s", substr($chargeDate, 0, 10));
$chargeAmountTemp = $chargeObject->amount;
$chargeAmount = floatval(($chargeAmountTemp));
$chargeStatus = $chargeObject->status;
$StripeCustomerID = $chargeObject->customer;    
$RK_EmailAddress = $chargeObject->receipt_email;

if (property_exists($chargeObject, "payment_method") && $chargeObject->payment_method != "")
    $chargeMethodID = $chargeObject->payment_method;
else
    $chargeMethodID = "";


$lastFour = "n/a";
$cardBrand = "n/a";
$cardType = "n/a";
if (property_exists($chargeObject, "payment_method_details") && $chargeObject->payment_method_details != "")
{
    if (property_exists($chargeObject->payment_method_details, "card") && $chargeObject->payment_method_details->card != "") {
        $cardObject = $chargeObject->card;
        if (property_exists($cardObject, "funding")) {
            $cardType = $cardObject->funding;
        }
        if (property_exists($cardObject, "last4")) {
            $lastFour = $cardObject->last4;
        }
        if (property_exists($cardObject, "brand")) {
            $cardBrand = $cardObject->brand;
        }
    } else
	{
		$cardType = $chargeMethodID;  // just going to put the charge method ID in there so we can look it up later if needed.
	}
}
if (property_exists($chargeObject,"metadata") && $chargeObject->metadata != "")
    $randomStuffString = serialize($chargeObject->metadata);
else
    $randomStuffString = "";

$MemberID = $dbObject->getMemberIDFromStripeID($StripeCustomerID);

$myLogger->logDebug("Got info.  type:".$eventType.", ID ".$chargeID.", date ".$tempDate.", amount: ".$chargeAmountTemp.", status: ".$chargeStatus);


// OK, on to the specific events


if ($event_json->type=='charge.succeeded' || $event_json->type =='charge.captured') {
    $handled=true;
    
    $eventResult = 'Paid';
    

    if ($MemberID  == "PENDING") {
        // then this is the first charge.  We need the signup page to handle it.
        $myLogger->logDebug(" Ignored stripe charge event because it's for a pending tenant.  Stripe ID: ".$chargeID.", Pending ID:".$chargeObject->metadata->SubmissionID);
    } else {
        if (property_exists($chargeObject, "invoice") && $chargeObject->invoice != null) {
			// it's an MU charge
			 $InvoiceID = $chargeObject->invoice;
            /* we're going to handle this with an invoice handler */
            $myLogger->logDebug("about to save stripe result.  chargeID : ".$chargeID.", chargeDate: ".$chargeDate.", amount:".$chargeAmount.", type:".$cardType.", last4: ".$lastFour.", invoice: ".$InvoiceID." TenantID: ".$MemberID);
            $chargeType = "Subscription";
            
            if ($MemberID > 0 && $MemberID != "") {
                //function saveMonthlyStripeResult($MemberID, $eventType, $chargeID, $chargeDate, $chargeAmount, $cardType, $lastFour, $eventResult, $invoiceID)
                $dbObject->saveMonthlyStripeResult($MemberID, $chargeType, $chargeID, $chargeDate, $chargeAmount, $cardType, $lastFour, $eventResult, $InvoiceID);
                $dbObject->logUserEvent("$".$chargeAmount." Stripe charge paid for subscription.  InvoiceID: ".$InvoiceID, $MemberID);
                $dbObject->resumeMemberReporting($MemberID);
                $myLogger->logDebug(" resumed tenant reporting for tenant.  ".$MemberID);
            }
        } else {
            // then this is a one-time charge
            // this means that the registration page is handling this, so we'll ignore it.
            $chargeType = "Registration";
            if (property_exists($chargeObject->metadata, 'RK_ChargeID')) {
                $RK_ChargeID = $chargeObject->metadata->RK_ChargeID;
            } else {
                $RK_ChargeID = "";
            }
            
            $msg = $chargeType." chargeID : ".$chargeID.", RK ChargeID:".$RK_ChargeID.", RK UserID:".$MemberID;
            $msg .= " chargeDate: ".$chargeDate.", source charge date:".$tempDate.", amount:".$chargeAmount;
            $msg .= ", source amount:".$chargeAmountTemp.", type:".$cardType.", last4: ".$lastFour;

            $myLogger->logDebug($msg);
            $sql = "select count(*) from StripePayments where StripePaymentID = ?";
        
            $stmt = $dbObject->connection->prepare($sql);
            $stmt->bindParam(1, $RK_ChargeID);
            $stmt->execute();
            $paymentCount = $stmt->fetch(PDO::FETCH_NUM);
            if ($paymentCount[0] == 0) {
                $myLogger->logDebug(" no previous payment found, inserting a new one with the Stripe CustomerID if we can.");
                if ($MemberID > 0 && $MemberID != "") {
                    //function saveMonthlyStripeResult($MemberID, $eventType, $chargeID, $chargeDate, $chargeAmount, $cardType, $lastFour, $eventResult, $invoiceID)
                    $dbObject->saveMonthlyStripeResult($MemberID, $chargeType, $chargeID, $chargeDate, $chargeAmount, $cardType, $lastFour, $eventResult, "");
                    $dbObject->resumeMemberReporting($MemberID);
                    $dbObject->logUserEvent("$".$MemberID." Stripe charge paid, unknown reason why. ", $MemberID);
                }
            } else {
                $myLogger->logDebug(" FOUND previous payment.");
                $dbObject->updateStripeResult($RK_ChargeID, $chargeID, $chargeDate, $chargeAmount, $cardType, $lastFour, $eventResult, $randomStuffString);
                $myLogger->logDebug("saved stripe result.  chargeID : ".$chargeID.", chargeDate: ".$chargeDate.", amount:".$chargeAmount.", type:".$cardType.", last4: ".$lastFour);
                $dbObject->logUserEvent("$".$chargeAmount." Stripe charge paid for registration", $MemberID);
                $dbObject->resumeMemberReporting($MemberID);
            }
        }     
    }
} 

if ($event_json->type=='charge.refunded') {
    $handled=true;
    
    $eventResult = 'Refunded';


    
    // the amount is in different field for a refund
    $chargeAmountTemp = $chargeObject->amount_refunded;
    $chargeAmount = floatval(($chargeAmountTemp)/100);
    
    //$myLogger->logDebug("refund event - data object: ".print_r($chargeObject, true));
    
    if ($chargeObject->invoice == null || $chargeObject->invoice == "") {
        // then this is a one-time charge
        if ($chargeObject->invoice == null) {
            $myLogger->logDebug(" refund event null invoice");
        } else {
            $myLogger->logDebug(" refund event invoice == ''");
        }
        
        $chargeType = "Registration";
        $myLogger->logDebug(" ".$eventType." chargeID : ".$chargeID.", RK UserID:".$MemberID." chargeDate: ".$chargeDate.", source charge date:".$tempDate.", amount:".$chargeAmount.", source amount:".$chargeAmountTemp.", type:".$cardType.", last4: ".$lastFour);
        $myLogger->logDebug(" inserting a new refund item.");
        
        if ($MemberID > 0) {
            $dbObject->saveStripeResultByMemberID($MemberID, $StripeCustomerID, $chargeType, $chargeID, $chargeDate, (-1 * $chargeAmount), $cardType, $lastFour, $eventResult, $randomStuffString);
            $dbObject->logUserEvent("$".$chargeAmount." Stripe charge refunded for registration.", $MemberID);
        }
    } else {
        $chargeType = "Subscription";
        $InvoiceID = $chargeObject->invoice;
        $myLogger->logDebug(" refund event invoice ID:".$InvoiceID);
        
        if ($MemberID > 0) {
            //$dbObject->saveMonthlyStripeResult($MemberID, $StripeCustomerID, $RK_EmailAddress, $eventType, $chargeID, $chargeDate, (-1 * $chargeAmount), $cardType, $lastFour, $eventResult, $randomStuffString, $InvoiceID);
			$dbObject->saveMonthlyStripeResult($MemberID, $chargeType, $chargeID, $chargeDate, (-1 * $chargeAmount), $cardType, $lastFour, $eventResult, $InvoiceID);
            $dbObject->logUserEvent("$".$chargeAmount." Stripe charge refunded for subscription.", $MemberID);
        }   
    }
} 
if ($event_json->type=='charge.failed') {
    // mark the tenant as non-reporting or delete them all together.
    $handled=true;
    
    
    $failureCode = $chargeObject->failure_code;
    if (property_exists($chargeObject, "failure_message") && $chargeObject->failure_message !== "") {
        $eventResult = "Failed: ".$failureCode.", ".$chargeObject->failure_message.".";
    } else {
        $eventResult = 'Failed. '.$failureCode;
    }
    

    if (property_exists($chargeObject->metadata, 'MemberID')) {
        $MetadataMemberID = $chargeObject->metadata->MemberID;
    } else {
        $MetadataMemberID = "";        
    }
    if ($MetadataMemberID == "PENDING") {
        // pretty much do nothing
        $myLogger->logDebug(" Ignored stripe charge event because it's for a pending Member.  Pending ID:".$chargeObject->metadata->SubmissionID);
    } else {
        
        if ($chargeObject->invoice == null) {
            // then this is a one-time charge
            $eventType = "Registration";
            if (property_exists($chargeObject->metadata, 'RK_ChargeID')) {
                $RK_ChargeID = $chargeObject->metadata->RK_ChargeID;
            } else {
                $RK_ChargeID = "";
            }
            $myLogger->logDebug(" ".$eventType." chargeID : ".$chargeID.", RK ChargeID:".$RK_ChargeID.", RK UserID:".$MemberID." chargeDate: ".$chargeDate.", source charge date:".$tempDate.", amount:".$chargeAmount.", source amount:".$chargeAmountTemp.", type:".$cardType.", last4: ".$lastFour);
            $sql = "select count(*) from StripePayments where StripePaymentID = ?";
        
            $stmt = $dbObject->connection->prepare($sql);
            $stmt->bindParam(1, $RK_ChargeID);
            $stmt->execute();
            $paymentCount = $stmt->fetch(PDO::FETCH_NUM);
            if ($paymentCount[0] == 0) {
                $myLogger->logDebug(" no previous payment found, inserting a new one with the stripe customer ID if we can.");
                if ($MemberID > 0) {
                    $dbObject->saveStripeResultByMemberID($MemberID, $StripeCustomerID, $eventType, $chargeID, $chargeDate, $chargeAmount, $cardType, $lastFour, $eventResult, $randomStuffString);
                    $dbObject->logUserEvent("$".$chargeAmount." Stripe charge FAILED for registration", $MemberID);
                }
            } else {
                $myLogger->logDebug(" FOUND previous payment.");
                $dbObject->updateStripeResult($RK_ChargeID, $chargeID, $chargeDate, $chargeAmount, $cardType, $lastFour, $eventResult, $randomStuffString);
                $myLogger->logDebug(" saved stripe result.  chargeID : ".$chargeID.", chargeDate: ".$chargeDate.", amount:".$chargeAmount.", type:".$cardType.", last4: ".$lastFour);
                $dbObject->logUserEvent("$".$chargeAmount." Stripe charge FAILED for registration", $MemberID);    
            }
        } else {
            // get the invoice ID and the month for it.
            $eventType = "Subscription";
            $InvoiceID = $chargeObject->invoice;
            $myLogger->logDebug(" FAILED charge event invoice ID:".$InvoiceID);
            
            if ($MemberID > 0) {
                $dbObject->saveMonthlyStripeResult($MemberID, $StripeCustomerID, $RK_EmailAddress, $eventType, $chargeID, $chargeDate, $chargeAmount, $cardType, $lastFour, $eventResult, $randomStuffString, $InvoiceID);
                $dbObject->logUserEvent("$".$chargeAmount." Stripe charge FAILED for subscription.  InvoiceID: ".$InvoiceID, $MemberID);
                // we want to the let the invoice handler take care of this for us.
                //$dbObject->UpdateStripeInvoiceDetails($InvoiceID,"Failed", $chargeAmount, $chargeDate, $chargeID); 
            }
        }
        $dbObject->suspendMemberReporting($MemberID);
    }
} 

if ($event_json->type=='charge.updated' || $event_json->type=='charge.pending') {
    // just want to log it, really.
    $handled=true;
    $eventType = $event_json->type;
    
    //$RK_EmailAddress = $chargeObject->receipt_email;
    $myLogger->logDebug($event_json->type.".  Not doing anything about it. ChargeID : ".$chargeID.", RK ChargeID:".$RK_ChargeID.", RK UserID:".$MemberID." chargeDate: ".$chargeDate.", source charge date:".$tempDate.", amount:".$chargeAmount.", source amount:".$chargeAmountTemp.", type:".$cardType.", last4: ".$lastFour);
    $dbObject->logUserEvent("$".$chargeAmount." Stripe charge updated for registration. ChargeID : ".$chargeID.", RK ChargeID:".$RK_ChargeID.", RK UserID:".$MemberID." chargeDate: ".$chargeDate.", source charge date:".$tempDate.", amount:".$chargeAmount.", source amount:".$chargeAmountTemp.", type:".$cardType.", last4: ".$lastFour.", status: ".$chargeStatus, $tenantID);
    // logUserEvent
} 




if ($handled == false) {
    $myLogger->logDebug(" unhandled EVENT CONTENTS: ".print_r($event_json, true));
}


?>
