<?php

define("IN_SITE", true);
require_once(__DIR__."/../libs/db.php");
require_once(__DIR__."/../libs/lang.php");
require_once(__DIR__."/../libs/helper.php");
require_once(__DIR__."/../libs/database/users.php");
$CMSNT = new DB();

// Nhận request từ callback
$request_data = $_GET;

// Kiểm tra các tham số callback nhận được
if (!isset($request_data['request_id'], $request_data['merchant_id'], $request_data['api_key'], $request_data['received'], $request_data['status'])) {
    http_response_code(400);
    echo json_encode([
        'status' => 'error',
        'message' => 'Thiếu tham số callback.'
    ]);
    exit;
}

$request_id = validate_alphanumeric($request_data['request_id'], 255);      // Mã giao dịch bí mật của hệ thống
$merchant_id = validate_alphanumeric($request_data['merchant_id'], 255);    // ID cửa hàng tạo hóa đơn
$api_key = validate_string($request_data['api_key'], 2000);                 // API KEY của cửa hàng
$received = validate_float($request_data['received'], 0.0);                 // Số lượng USDT thực nhận được
$status = validate_string($request_data['status'], 50);                     // Trạng thái: waiting, expired, completed
$from_address = isset($request_data['from_address']) ? validate_string($request_data['from_address'], 2000) : null;        // Địa chỉ USDT gửi tiền
$transaction_id = isset($request_data['transaction_id']) ? validate_string($request_data['transaction_id'], 2000) : null;  // Mã giao dịch blockchain

// Validate bắt buộc
if ($request_id === false || $merchant_id === false || $api_key === false || $received === false || $status === false) {
    http_response_code(400);
    echo json_encode([
        'status' => 'error',
        'message' => 'Dữ liệu không hợp lệ.'
    ]);
    exit;
}

// Xác minh tính hợp lệ của callback tránh giả mạo callback
$expected_merchant_id = $CMSNT->site('crypto_merchant_id'); // Merchant ID của bạn 
$expected_api_key = $CMSNT->site('crypto_api_key'); // API Key của bạn
if ($merchant_id !== $expected_merchant_id || $api_key !== $expected_api_key) {
    http_response_code(403);
    echo json_encode([
        'status' => 'error',
        'message' => 'Merchant ID hoặc API Key không hợp lệ.'
    ]);
    exit;
}

// Kiểm tra hóa đơn tồn tại
if(!$row = $CMSNT->get_row_safe("SELECT * FROM `crypto_invoice` WHERE `request_id` = ?", [$request_id])){
    http_response_code(404);
    echo json_encode([
        'status' => 'error',
        'message' => 'Hóa đơn không tồn tại'
    ]);
    exit;
}

// HOÁ ĐƠN ĐÃ CỘNG TIỀN SẼ KHÔNG THAY ĐỔI TRẠNG THÁI
if($row['status'] == 'completed'){
    http_response_code(200);
    echo json_encode([
        'status' => 'error',
        'message' => 'Hoá đơn này đã được xử lý rồi'
    ]);
    exit;
}

// Lấy thông tin user
$getUser = $CMSNT->get_row_safe("SELECT * FROM `users` WHERE `id` = ?", [$row['user_id']]);

// Xử lý trạng thái giao dịch
switch ($status) {
    case 'waiting':
        // Giao dịch đang chờ thực hiện
        // Không cần xử lý gì, giữ nguyên trạng thái
        http_response_code(200);
        echo json_encode([
            'status' => 'success',
            'message' => 'Giao dịch đang chờ xử lý.'
        ]);
        break;
        
    case 'expired':
        // Giao dịch đã hết hạn
        $CMSNT->update('crypto_invoice', [
            'status'            => 'expired',
            'update_gettime'    => gettime()
        ], " `id` = ? ", [$row['id']]);
        
        http_response_code(200);
        echo json_encode([
            'status' => 'success',
            'message' => 'Cập nhật trạng thái expired thành công.'
        ]);
        break;
        
    case 'completed':
        // Giao dịch đã hoàn tất
        $isUpdate = $CMSNT->update('crypto_invoice', [
            'status'            => 'completed',
            'update_gettime'    => gettime()
        ], " `id` = ? ", [$row['id']]);
        
        if($isUpdate){
            $User = new users();
            
            // Tính số tiền thực nhận = received * rate_crypto
            $thucnhan = $received * $CMSNT->site('rate_crypto');
            
            // TÍNH TOÁN KHUYẾN MÃI NẠP TIỀN
            foreach($CMSNT->get_list_safe("SELECT * FROM `promotions` WHERE `amount` <= ? AND `status` = 1 ORDER by `amount` DESC ", [$thucnhan]) as $promotion){
                $thucnhan = $thucnhan + $thucnhan * $promotion['discount'] / 100;
                break;
            }
            
            // Cộng tiền cho user
            $isCong = $User->AddCredits($row['user_id'], $thucnhan, "Crypto Recharge #".$row['trans_id'], 'TOPUP_CRYPTO_NEW_'.$row['trans_id']);
            
            if($isCong){
                /** SEND NOTI CHO ADMIN */
                $my_text = $CMSNT->site('naptien_notification');
                $my_text = str_replace('{domain}', $_SERVER['SERVER_NAME'], $my_text);
                $my_text = str_replace('{username}', $getUser['username'], $my_text);
                $my_text = str_replace('{method}', 'Crypto', $my_text);
                $my_text = str_replace('{amount}', $received.' USDT', $my_text);
                $my_text = str_replace('{price}', format_currency($thucnhan), $my_text);
                $my_text = str_replace('{time}', gettime(), $my_text);
                sendMessAdmin($my_text);
                
                http_response_code(200);
                echo json_encode([
                    'status' => 'success',
                    'message' => 'Callback đã được xử lý thành công.'
                ]);
            } else {
                http_response_code(500);
                echo json_encode([
                    'status' => 'error',
                    'message' => 'Không thể cộng tiền cho user.'
                ]);
            }
        } else {
            http_response_code(500);
            echo json_encode([
                'status' => 'error',
                'message' => 'Không thể cập nhật trạng thái hóa đơn.'
            ]);
        }
        break;
        
    default:
        http_response_code(400);
        echo json_encode([
            'status' => 'error',
            'message' => 'Trạng thái giao dịch không hợp lệ.'
        ]);
        exit;
}
