<?php
/**
 * ไฟล์สร้าง QR Code PromptPay แบบไม่ต้องพึ่งไลบรารีภายนอก
 * ใช้ EMVCo QR Code สำหรับระบบ PromptPay ของประเทศไทย
 * อ้างอิง: https://www.bot.or.th/Thai/PaymentSystems/StandardPS/Documents/ThaiQRCode_Payment_Standard.pdf
 */

/**
 * สร้าง PromptPay QR Code Payload string ตามมาตรฐาน EMVCo
 * @param string $phoneOrId เบอร์โทรศัพท์ หรือเลขบัตรประชาชน (13 หลัก)
 * @param float|null $amount จำนวนเงิน (ถ้าไม่ระบุ ลูกค้าพิมพ์เองได้)
 * @return string payload string สำหรับสร้าง QR Code
 */
function generatePromptPayPayload(string $phoneOrId, ?float $amount = null): string {
    // ทำความสะอาดเบอร์โทร: ลบอักขระที่ไม่ใช่ตัวเลข
    $id = preg_replace('/[^0-9]/', '', $phoneOrId);

    // แปลงเบอร์โทรเป็นรูปแบบสากล (+66...)
    if (strlen($id) === 10 && $id[0] === '0') {
        $id = '0066' . substr($id, 1);
    } elseif (strlen($id) === 13) {
        // เลขบัตรประชาชน ใช้ได้ตรง
    } else {
        // ถ้าไม่ตรงรูปแบบให้ใช้ดิบ
        $id = '0066' . $id;
    }

    // Helper: สร้าง TLV (Tag Length Value) string
    $f = function(string $tag, string $val): string {
        return $tag . str_pad(strlen($val), 2, '0', STR_PAD_LEFT) . $val;
    };

    // กำหนด GUID PromptPay สำหรับ Thailand
    $guid = 'A000000677010111'; // เบอร์โทร
    if (strlen(preg_replace('/[^0-9]/', '', $phoneOrId)) === 13) {
        $guid = 'A000000677010113'; // เลขบัตรประชาชน
    }

    $accountInfo = $f('00', $guid) . $f('01', $id);

    $payload = '';
    $payload .= $f('00', '01');               // Payload Format Indicator
    $payload .= $f('01', '12');               // Point of Initiation (12 = dynamic if amount set, 11 = static)
    $payload .= $f('29', $accountInfo);       // Merchant Account Info (PromptPay)
    $payload .= $f('52', '0000');             // Merchant Category Code
    $payload .= $f('53', '764');              // Transaction Currency (764 = THB)

    if ($amount !== null && $amount > 0) {
        $amountStr = number_format($amount, 2, '.', '');
        $payload .= $f('54', $amountStr);     // Transaction Amount
        // เปลี่ยน Point of Initiation เป็น dynamic (11=static, 12=dynamic)
        $payload = str_replace($f('01', '12'), $f('01', '12'), $payload);
    } else {
        // Static QR (ลูกค้าพิมพ์จำนวนเองได้)
        $payload = str_replace($f('01', '12'), $f('01', '11'), $payload);
    }

    $payload .= $f('58', 'TH');              // Country Code
    $payload .= $f('59', 'PromptPay');       // Merchant Name (max 25 chars)
    $payload .= $f('60', 'Bangkok');          // Merchant City

    // CRC16-CCITT checksum
    $payload .= '6304'; // CRC field header (will compute below)
    $payload .= crc16($payload);

    return $payload;
}

/**
 * คำนวณ CRC-16 CCITT (เหมือน EMVCo standard)
 */
function crc16(string $str): string {
    $crc = 0xFFFF;
    $len = strlen($str);
    for ($i = 0; $i < $len; $i++) {
        $crc ^= ord($str[$i]) << 8;
        for ($j = 0; $j < 8; $j++) {
            if ($crc & 0x8000) {
                $crc = ($crc << 1) ^ 0x1021;
            } else {
                $crc <<= 1;
            }
            $crc &= 0xFFFF;
        }
    }
    return strtoupper(str_pad(dechex($crc), 4, '0', STR_PAD_LEFT));
}

/**
 * สร้าง QR Code image โดยใช้ QR Server API (ไม่ต้องติดตั้งไลบรารีเพิ่ม)
 * @param string $payload PromptPay payload string
 * @param int $size ขนาด QR Code pixel
 * @return string URL ของรูป QR Code
 */
function getPromptPayQrUrl(string $payload, int $size = 300): string {
    return 'https://api.qrserver.com/v1/create-qr-code/?size=' . $size . 'x' . $size . '&data=' . urlencode($payload) . '&margin=10&ecc=M';
}

// === ถ้าเรียกใช้ไฟล์นี้โดยตรง (API endpoint) ===
if (basename(__FILE__) === basename($_SERVER['PHP_SELF'] ?? '')) {
    header('Content-Type: application/json');
    
    $phone   = isset($_GET['phone']) ? trim($_GET['phone']) : '0970566414';
    $amount  = isset($_GET['amount']) ? (float)$_GET['amount'] : null;
    $size    = isset($_GET['size']) ? (int)$_GET['size'] : 300;

    $payload = generatePromptPayPayload($phone, $amount);
    $qrUrl   = getPromptPayQrUrl($payload, $size);

    echo json_encode([
        'status'  => 'success',
        'payload' => $payload,
        'qr_url'  => $qrUrl,
        'phone'   => $phone,
        'amount'  => $amount,
    ]);
}
