<?php
// ========================================
// درگاه پرداخت زرین‌پال
// پروژه فروشگاه کیف‌لند
// ========================================

class ZarinPal {
    private $merchantId;
    private $callbackUrl;
    private $apiRequest  = 'https://api.zarinpal.com/pg/v4/payment/request.json';
    private $apiVerify   = 'https://api.zarinpal.com/pg/v4/payment/verify.json';
    private $startPay    = 'https://www.zarinpal.com/pg/StartPay/';
    // برای تست از sandbox استفاده کنید:
    // private $apiRequest = 'https://sandbox.zarinpal.com/pg/v4/payment/request.json';
    // private $apiVerify  = 'https://sandbox.zarinpal.com/pg/v4/payment/verify.json';
    // private $startPay   = 'https://sandbox.zarinpal.com/pg/StartPay/';

    public function __construct($merchantId, $callbackUrl) {
        $this->merchantId  = $merchantId;
        $this->callbackUrl = $callbackUrl;
    }

    // ارسال درخواست پرداخت
    public function request($amount, $description, $email = '', $mobile = '') {
        $data = [
            'merchant_id'  => $this->merchantId,
            'amount'       => $amount, // مبلغ به تومان
            'description'  => $description,
            'callback_url' => $this->callbackUrl,
            'metadata'     => ['email' => $email, 'mobile' => $mobile]
        ];

        $response = $this->callApi($this->apiRequest, $data);

        if (isset($response['data']['code']) && $response['data']['code'] == 100) {
            return [
                'success'   => true,
                'authority' => $response['data']['authority'],
                'url'       => $this->startPay . $response['data']['authority']
            ];
        }

        $errorCode = $response['errors']['code'] ?? $response['data']['code'] ?? 'unknown';
        return [
            'success' => false,
            'error'   => $this->getErrorMessage($errorCode),
            'code'    => $errorCode
        ];
    }

    // تأیید پرداخت
    public function verify($authority, $amount) {
        $data = [
            'merchant_id' => $this->merchantId,
            'authority'   => $authority,
            'amount'      => $amount
        ];

        $response = $this->callApi($this->apiVerify, $data);

        if (isset($response['data']['code']) && in_array($response['data']['code'], [100, 101])) {
            return [
                'success'  => true,
                'ref_id'   => $response['data']['ref_id'],
                'card_pan' => $response['data']['card_pan'] ?? '',
                'code'     => $response['data']['code']
            ];
        }

        $errorCode = $response['errors']['code'] ?? $response['data']['code'] ?? 'unknown';
        return [
            'success' => false,
            'error'   => $this->getErrorMessage($errorCode),
            'code'    => $errorCode
        ];
    }

    // فراخوانی API
    private function callApi($url, $data) {
        $ch = curl_init($url);
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST           => true,
            CURLOPT_POSTFIELDS     => json_encode($data),
            CURLOPT_HTTPHEADER     => ['Content-Type: application/json', 'Accept: application/json'],
            CURLOPT_TIMEOUT        => 30,
            CURLOPT_SSL_VERIFYPEER => true,
        ]);
        $result = curl_exec($ch);
        $error  = curl_error($ch);
        curl_close($ch);

        if ($error) {
            return ['errors' => ['code' => -999, 'message' => $error]];
        }

        return json_decode($result, true) ?? ['errors' => ['code' => -998]];
    }

    // ترجمه کد خطا
    private function getErrorMessage($code) {
        $messages = [
            '-1'  => 'اطلاعات ارسالی ناقص است',
            '-2'  => 'مرچنت کد معتبر نیست',
            '-3'  => 'با توجه به محدودیت‌های شاپرک امکان پرداخت وجود ندارد',
            '-4'  => 'سطح تأیید پذیرنده پایین‌تر از سطح نقره‌ای است',
            '-11' => 'درخواست مورد نظر یافت نشد',
            '-12' => 'امکان ویرایش درخواست وجود ندارد',
            '-21' => 'هیچ نوع عملیات مالی برای این تراکنش یافت نشد',
            '-22' => 'تراکنش ناموفق است',
            '-33' => 'رقم تراکنش با رقم پرداخت شده مطابقت ندارد',
            '-34' => 'سقف تقسیم تراکنش از لحاظ تعداد یا رقم عبور نموده است',
            '-40' => 'اجازه دسترسی به متد مربوطه وجود ندارد',
            '-41' => 'اطلاعات ارسال شده مربوط به AdditionalData غیرمعتبر است',
            '-42' => 'مدت زمان معتبر طول عمر شناسه پرداخت باید بین ۳۰ دقیقه تا ۴۵ روز باشد',
            '-54' => 'درخواست مورد نظر آرشیو شده است',
            '100' => 'عملیات موفق',
            '101' => 'پرداخت قبلاً تأیید شده است',
        ];
        return $messages[(string)$code] ?? 'خطای ناشناخته (کد: ' . $code . ')';
    }
}
?>
