<?php

// Client cho SMS Center (https://sms.lentrang1.com) — xem hướng dẫn tích
// hợp đầy đủ tại https://sms.lentrang1.com/tich-hop (cách xin app_id + API
// key và quy tắc tích hợp bắt buộc: verify OTP đúng 1 lần duy nhất, atomic
// với hành động thật).
//
// Copy file này vào project (vd app/Services/SmsCenter.php), rồi khai 3
// biến trong .env:
//   SMS_CENTER_BASE_URL=https://sms.lentrang1.com
//   SMS_CENTER_APP_ID=<app_id được cấp>
//   SMS_CENTER_API_KEY=<API key được cấp, chỉ hiện 1 lần lúc tạo>
//
// Không phụ thuộc Laravel — chỉ dùng cURL thuần, dùng được ở bất kỳ PHP
// project nào (đổi getenv() sang config()/env() helper của framework nếu cần).

final class SmsCenter
{
    private const PHONE_RE = '/^0[35789]\d{8}$/';
    private const OTP_RE = '/^[0-9]{6}$/';

    public static function isValidPhone(string $phone): bool
    {
        return preg_match(self::PHONE_RE, $phone) === 1;
    }

    public static function isValidOtpFormat(string $otp): bool
    {
        return preg_match(self::OTP_RE, $otp) === 1;
    }

    /** POST /api/v1/otp/send — gửi mã OTP 6 số tới $phone (định dạng 0xxxxxxxxx). */
    public static function sendOtp(string $phone): array
    {
        return self::call('/api/v1/otp/send', ['phone' => $phone]);
    }

    /**
     * POST /api/v1/otp/verify — kiểm tra mã OTP.
     *
     * QUAN TRỌNG: verify đúng sẽ xoá ngay OTP phía server (chống replay),
     * nên gọi hàm này NGAY TẠI bước thực hiện hành động thật (tạo đơn, tạo
     * tài khoản, đổi mật khẩu...) — verify xong mới ghi dữ liệu, atomic
     * trong cùng 1 request. Không tách "verify riêng rồi mới hành động" ở
     * 2 bước khác nhau, vì verify lần 2 sẽ luôn fail dù mã đúng.
     */
    public static function verifyOtp(string $phone, string $otp): array
    {
        return self::call('/api/v1/otp/verify', ['phone' => $phone, 'otp' => $otp]);
    }

    /** @return array{ok: bool, status: int, data: array} */
    private static function call(string $path, array $body): array
    {
        $baseUrl = getenv('SMS_CENTER_BASE_URL');
        $appId = getenv('SMS_CENTER_APP_ID');
        $apiKey = getenv('SMS_CENTER_API_KEY');
        if (!$baseUrl || !$appId || !$apiKey) {
            throw new RuntimeException('Thiếu cấu hình SMS_CENTER_BASE_URL/SMS_CENTER_APP_ID/SMS_CENTER_API_KEY trong .env');
        }

        $body['app_id'] = $appId;

        $ch = curl_init(rtrim($baseUrl, '/') . $path);
        curl_setopt_array($ch, [
            CURLOPT_POST => true,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT => 10,
            CURLOPT_HTTPHEADER => [
                'Content-Type: application/json',
                'X-API-Key: ' . $apiKey,
            ],
            CURLOPT_POSTFIELDS => json_encode($body, JSON_UNESCAPED_UNICODE),
        ]);
        $raw = curl_exec($ch);
        if ($raw === false) {
            $err = curl_error($ch);
            curl_close($ch);
            throw new RuntimeException('SMS Center không phản hồi: ' . $err);
        }
        $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        $data = json_decode($raw, true) ?? [];

        return ['ok' => $status >= 200 && $status < 300, 'status' => $status, 'data' => $data];
    }
}
