<?php
ini_set('max_execution_time', '600');
define("BASEPATH", TRUE);

// Path verification based on your cPanel
require $_SERVER["DOCUMENT_ROOT"]."/vendor/autoload.php";
require $_SERVER["DOCUMENT_ROOT"]."/app/init.php";

$smmapi = new SMMApi();
$fapi = new socialsmedia_api();

/* FIX: Pehle dripfeed aur subs dono '1' par set thay.
  Ab ye query normal orders (0) aur baki sabko check karegi.
*/
$orders = $conn->prepare("SELECT *, services.service_id as service_id, services.service_api as api_id FROM orders 
    INNER JOIN clients ON clients.client_id=orders.client_id 
    INNER JOIN services ON services.service_id=orders.service_id 
    LEFT JOIN categories ON categories.category_id=services.category_id 
    INNER JOIN service_api ON service_api.id=orders.order_api 
    WHERE (orders.order_status=:statu1 || orders.order_status=:statu2 || orders.order_status=:statu3) 
    ORDER BY orders.order_create DESC");

$orders->execute(array(
    "statu1" => "pending", 
    "statu2" => "inprogress", 
    "statu3" => "processing"
));

$orders = $orders->fetchAll(PDO::FETCH_ASSOC);

foreach($orders as $order):
    $user = $conn->prepare("SELECT * FROM clients WHERE client_id=:id ");
    $user->execute(array("id" => $order["client_id"]));
    $user = $user->fetch(PDO::FETCH_ASSOC);
    
    $order["balance"] = $user["balance"];
    $clientBalance = $user["balance"];
    $orderid = $order["order_id"];

    if($order["api_type"] == 1):
        ## Standart api başla ##
        $orderstatus = $smmapi->action(array('key' => $order["api_key"], 'action' => 'status', 'order' => $order["api_orderid"]), $order["api_url"]);
        $balance = $smmapi->action(array('key' => $order["api_key"], 'action' => 'balance'), $order["api_url"]);
        $api_charge = $orderstatus->charge;
        $statu = str_replace(" ", "", strtolower($orderstatus->status));
        $start = $orderstatus->start_count;
        $remains = $orderstatus->remains;
        if(!$api_charge): $api_charge = 0; endif;
        $currency = $balance->currency;
        ## Standart api bitti ##
    elseif($order["api_type"] == 3):
        $orderstatus = $fapi->query(array('cmd' => 'orderstatus', 'token' => $order["api_key"], 'apiurl' => $order["api_url"], 'orderid' => [$order["api_orderid"]]));
        $balance = $fapi->query(array('cmd' => 'profile', 'token' => $order["api_key"], 'apiurl' => $order["api_url"]));
        $api_charge = $orderstatus[$order["api_orderid"]]["order"]["price"];
        $statu = str_replace(" ", "", strtolower($orderstatus[$order["api_orderid"]]["order"]["status"]));
        $start = $orderstatus[$order["api_orderid"]]["order"]["counter"]["start_count"];
        $remains = str_replace("+", "-", $orderstatus[$order["api_orderid"]]["order"]["counter"]["remains"]);
        if(!$api_charge): $api_charge = 0; endif;
        $currency = "TRY";
    endif;

    // Default values if empty
    if(empty($start) || !$start): $start = 0; endif;
    if(empty($remains) || !$remains): $remains = 0; endif;
    if($remains > $order["order_quantity"]): $remains = $order["order_quantity"]; endif;

    ## Status Updates ##
    if($statu == "canceled" || $statu == "cancel" || $statu == "cancelled"):
        $conn->beginTransaction();
        $update2 = $conn->prepare("UPDATE clients SET balance=:balance, spent=:spent WHERE client_id=:id ");
        $update2->execute(array("id" => $order["client_id"], "balance" => $order["balance"] + $order["order_charge"], "spent" => $order["spent"] - $order["order_charge"]));
        
        $user_up = $conn->prepare("SELECT * FROM clients WHERE client_id=:id ");
        $user_up->execute(array("id" => $order["client_id"]));
        $user_up = $user_up->fetch(PDO::FETCH_ASSOC);

        $report = $conn->prepare("INSERT INTO client_report SET client_id=:id, action=:action, report_ip=:ip, report_date=:date ");
        $report->execute(array("date" => date("Y-m-d H:i:s"), "id" => $order["client_id"], "action" => "#".$orderid." Order canceled. Amount refunded.", "ip" => "127.0.0.1"));
        
        $update = $conn->prepare("UPDATE orders SET order_start=:start, order_remains=:remains, order_status=:status, order_charge=:charge, api_charge=:api_charge WHERE order_id=:id ");
        $update->execute(array("id" => $orderid, "start" => $start, "remains" => $remains, "status" => "canceled", "charge" => 0, "api_charge" => 0));
        $conn->commit();

    elseif($statu == 'complete' || $statu == 'completed'):
        $conn->beginTransaction();
        $update = $conn->prepare("UPDATE orders SET order_start=:start, order_remains=:remains, order_status=:status, api_charge=:api_charge, order_profit=:profit WHERE order_id=:id ");
        $update->execute(array("start" => $start, "remains" => 0, "status" => "completed", "id" => $orderid, "profit" => $order["order_charge"] - $api_charge, "api_charge" => $api_charge));
        $conn->commit();

    elseif($statu == 'pending' || $statu == 'inprogress' || $statu == 'processing'):
        if($start == 0): $start = $order["order_start"]; endif;
        $update = $conn->prepare("UPDATE orders SET order_start=:start, order_status=:status, order_remains=:remains, api_charge=:api_charge WHERE order_id=:id ");
        $update->execute(array("start" => $start, "status" => $statu, "remains" => $remains, "id" => $orderid, "api_charge" => $api_charge));

    elseif($statu == "partial"):
        $conn->beginTransaction();
        $return_price = ($order["order_charge"] / $order["order_quantity"]) * $remains;
        $update2 = $conn->prepare("UPDATE clients SET balance=:balance, spent=:spent WHERE client_id=:id ");
        $update2->execute(array("id" => $order["client_id"], "balance" => $order["balance"] + $return_price, "spent" => $order["spent"] - $return_price));
        
        $update = $conn->prepare("UPDATE orders SET order_start=:start, order_remains=:remains, order_status=:status, order_charge=:charge, api_charge=:api_charge WHERE order_id=:id ");
        $update->execute(array("id" => $orderid, "start" => $start, "remains" => $remains, "status" => "partial", "charge" => $order["order_charge"] - $return_price, "api_charge" => $api_charge));
        $conn->commit();
    endif;

    $update = $conn->prepare("UPDATE orders SET last_check=:check WHERE order_id=:id ");
    $update->execute(array("id" => $orderid, "check" => date("Y-m-d H:i:s")));
endforeach; 

echo "Cron Run Successfully at ".date("Y-m-d H:i:s");