<?php

ini_set('display_errors', 1);
error_reporting(E_ALL);

/* ========================== DB CONFIG ========================== */

$DB_HOST = '136.112.153.136';
$DB_USER = 'lac';
$DB_PASS = 'kschhiKHSH23243#';
$DB_NAME = 'lac_prod';
$DB_PORT = '3306';

$raw_log_file = 'roku_webhook_log.txt';

/* ========================== READ RAW PAYLOAD ========================== */

$rawPayload = file_get_contents("php://input");
$payload = json_decode($rawPayload, true);

file_put_contents($raw_log_file, date('Y-m-d H:i:s')." RAW PAYLOAD:\n".$rawPayload."\n\n", FILE_APPEND | LOCK_EX);

/* ========================== REQUEST VALIDATION ========================== */

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {

    file_put_contents($raw_log_file, date('Y-m-d H:i:s')." ERROR: Invalid request method\n", FILE_APPEND);

    http_response_code(405);
    exit("POST required");
}

if (empty($payload)) {

    file_put_contents($raw_log_file, date('Y-m-d H:i:s')." ERROR: Empty payload\n", FILE_APPEND);

    http_response_code(400);
    exit("Empty payload");
}

/* ========================== EXTRACT DATA ========================== */

$roku_price  = $payload['price'] ?? '';
$transactionType = $payload['transactionType'] ?? '';
$customerID  = $payload['customerId'] ?? '';
$TxnId       = $payload['transactionId'] ?? '';
$originalTxnId = $payload['originalTransactionId'] ?? '';
$startDate = !empty($payload['eventDate']) ? date("Y-m-d H:i:s", strtotime($payload['eventDate'])) : null;
$expireDate = !empty($payload['expirationDate']) ? date("Y-m-d H:i:s", strtotime($payload['expirationDate'])) : null;
$eventType = $transactionType ?? 'unknown_event';

/* ========================== DEFAULT VALUES ========================== */

$subscription_id = null;
$user_id  = null;
$order_id = null;
$package_id = null;

$app_id = 5013;
$source = 'ROKU';

/* ========================== DB CONNECTION ========================== */

$conn = new mysqli($DB_HOST,$DB_USER,$DB_PASS,$DB_NAME,$DB_PORT);

if ($conn->connect_error) {

    file_put_contents($raw_log_file, date('Y-m-d H:i:s')." DB CONNECTION ERROR: ".$conn->connect_error."\n", FILE_APPEND);

    exit("DB error");
}

/* ========================== INSERT WEBHOOK LOG ========================== */

$sql = "INSERT INTO roku_webhook_log (hook_event,log_data,gateway_ref_id,user_id,order_id,app_id,source,txn_id,org_txn_id) VALUES ('$eventType','".mysqli_real_escape_string($conn,$rawPayload)."','','$user_id','$order_id','$app_id','$source','$TxnId','$originalTxnId')";

if(!$conn->query($sql)){
    file_put_contents($raw_log_file, date('Y-m-d H:i:s')." WEBHOOK LOG INSERT ERROR: ".$conn->error."\n", FILE_APPEND);
}

/* =========================================================
FETCH ORDER USING originalTxnId
========================================================= */

if(!empty($originalTxnId)){

    $fetchSql = "SELECT OD.order_id,OD.item_id AS package_id,OD.subscriber_id,OD.item_name,OD.item_price,OD.currency,C.org_txn_id,OD.period,OD.period_interval,OD.autorenew FROM tbl_order_details OD JOIN roku_customer_mapping C ON C.uid=OD.subscriber_id WHERE C.org_txn_id='$originalTxnId' ORDER BY OD.id DESC LIMIT 1";

    $resultFetch = $conn->query($fetchSql);

    if($resultFetch && $resultFetch->num_rows>0){

        $orderRow = $resultFetch->fetch_assoc();
        $order_id   = $orderRow['order_id'];
        $user_id    = $orderRow['subscriber_id'];
        $package_id = $orderRow['package_id'];
        $period = $orderRow['period'];
        $period_interval = $orderRow['period_interval'];
        $autorenew = '1';

        /* ========================== DEVICE INFO ========================== */

        $getdeviceSql="SELECT device_id,currency,currency_id FROM tbl_order WHERE id='$order_id' LIMIT 1";
        $deviceResult=$conn->query($getdeviceSql);
        $device_id='';
        $currency='';
        $currency_id='';

        if($deviceResult && $deviceResult->num_rows>0){
        $deviceRow=$deviceResult->fetch_assoc();
        $device_id=$deviceRow['device_id'];
        $currency=$deviceRow['currency'];
        $currency_id=$deviceRow['currency_id'];
        }

        /* ========================== DUPLICATE CHECK ========================== */

        $checkduplisubs="SELECT id FROM tbl_customer_subscriptions WHERE subscriber_id='$user_id' AND order_id='$order_id' AND package_id='$package_id' AND status='2' LIMIT 1";

        $resultCheckDup=$conn->query($checkduplisubs);

        /* =========================================================
        SALE EVENT
        ========================================================= */

        if($eventType=='Sale'){

            $pg_data=json_encode($payload);
            
            if($roku_price==0){
                $device_id=1;
            }else{
                $device_id=0;
            }

            $purchaseType = 'PURCHASED';
            if($TxnId != $originalTxnId){
                $purchaseType = 'RENEWED';
            }

            $now=date("Y-m-d H:i:s");
            $conn->query("UPDATE tbl_customer_subscriptions SET status=7,end_date='$now' WHERE gateway_subscription_id='".$originalTxnId."' AND status IN (2,3) AND trans_id!='".$TxnId."' ");

            $insertSql="INSERT INTO tbl_customer_subscriptions (app_id,order_id,trans_id,pg_ref_id,gateway_subscription_id,pg_payment_data,channel,package_id,package_title,price,subscriber_id,gateway_type,pg_name,start_date,end_date,currency,created,status,platform,purchase_token,device_id,package_mode,purchase_type,autorenew,period,period_interval,currency_id) VALUES ('$app_id','$order_id','$TxnId','$TxnId','$originalTxnId','".mysqli_real_escape_string($conn,$rawPayload)."','roku','$package_id','".mysqli_real_escape_string($conn,$orderRow['item_name'])."','$roku_price','$user_id','29','roku','$startDate','$expireDate','$currency',NOW(),'2','webhook','','$device_id','OTT','$purchaseType','$autorenew','$period','$period_interval','$currency_id')";

            if($resultCheckDup && $resultCheckDup->num_rows>0){
                file_put_contents($raw_log_file, date('Y-m-d H:i:s')." DUPLICATE SUBSCRIPTION FOUND order_id=$order_id\n", FILE_APPEND);
            }else{
                if(!$conn->query($insertSql)){
                    file_put_contents($raw_log_file, date('Y-m-d H:i:s')." SUBSCRIPTION INSERT ERROR: ".$conn->error."\n", FILE_APPEND);
                }else{
                    file_put_contents($raw_log_file, date('Y-m-d H:i:s')." SUBSCRIPTION INSERT SUCCESS order_id=$order_id\n", FILE_APPEND);
                    $updateOrderSql="UPDATE tbl_order SET payment_status='2',order_status='2' WHERE id='$order_id'";
                    if(!$conn->query($updateOrderSql)){
                        file_put_contents($raw_log_file, date('Y-m-d H:i:s')." ORDER UPDATE ERROR: ".$conn->error."\n", FILE_APPEND);
                    }
                    echo "Subscription has been assigned.";
                }
            }

        }

        /* =========================================================
        CANCEL EVENT
        ========================================================= */

        if($eventType=='Cancellation'){
            $cancelSql="UPDATE tbl_customer_subscriptions SET is_cancelled='1',cancelled_at=NOW() WHERE order_id='$order_id' AND subscriber_id='$user_id' AND package_id='$package_id' AND status='2'";
            $conn->query($cancelSql);
            $conn->query("UPDATE tbl_order SET order_status='4',payment_status='4' WHERE id='$order_id'");
            file_put_contents($raw_log_file, date('Y-m-d H:i:s')." SUBSCRIPTION CANCELLED order_id=$order_id\n", FILE_APPEND);
            echo "Subscription has been cancelled.";
        }

        /* =========================================================
        RESUBSCRIBE EVENT
        ========================================================= */

        if($eventType=='Resubscribe'){
            $conn->query("UPDATE tbl_customer_subscriptions SET is_cancelled='0' WHERE order_id='$order_id' AND subscriber_id='$user_id' AND package_id='$package_id' AND status='2'");
            $conn->query("UPDATE tbl_order SET order_status='2',payment_status='2' WHERE id='$order_id'");
            file_put_contents($raw_log_file, date('Y-m-d H:i:s')." SUBSCRIPTION RESUBSCRIBED order_id=$order_id\n", FILE_APPEND);
            echo "Subscription has been Resubscribe.";
        }

    }else{
        file_put_contents($raw_log_file, date('Y-m-d H:i:s')." ORDER NOT FOUND originalTxnId=$originalTxnId\n", FILE_APPEND);
    }

}

$conn->close();

http_response_code(200);
echo "Webhook processed";
