// 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 thẳng vào project của bạn (vd src/lib/smsCenter.ts), rồi
// khai 3 biến môi trường:
//   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>

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

export function isValidPhone(phone: string): boolean {
  return PHONE_RE.test(phone);
}

export function isValidOtpFormat(otp: string): boolean {
  return OTP_RE.test(otp);
}

function smsCenterConfig() {
  const baseUrl = process.env.SMS_CENTER_BASE_URL;
  const appId = process.env.SMS_CENTER_APP_ID;
  const apiKey = process.env.SMS_CENTER_API_KEY;
  if (!baseUrl || !appId || !apiKey) {
    throw new Error('Thiếu cấu hình SMS_CENTER_BASE_URL/SMS_CENTER_APP_ID/SMS_CENTER_API_KEY trong .env');
  }
  return {
    baseUrl,
    appId,
    headers: { 'Content-Type': 'application/json', 'X-API-Key': apiKey },
  };
}

export interface SmsCenterResult<T = Record<string, unknown>> {
  ok: boolean;
  status: number;
  data: T;
}

export type SendOtpData = {
  job_id?: string;
  expires_in?: number;
  retry_after?: number;
  error?: string;
};

export type VerifyOtpData = {
  verified?: boolean;
  attempts_left?: number;
  retry_after?: number;
  error?: string;
};

/** POST /api/v1/otp/send — gửi mã OTP 6 số tới `phone` (định dạng 0xxxxxxxxx). */
export async function sendOtp(phone: string): Promise<SmsCenterResult<SendOtpData>> {
  const { baseUrl, appId, headers } = smsCenterConfig();
  const res = await fetch(`${baseUrl}/api/v1/otp/send`, {
    method: 'POST',
    headers,
    body: JSON.stringify({ phone, app_id: appId }),
  });
  const data = await res.json().catch(() => ({}));
  return { ok: res.ok, status: res.status, data };
}

/**
 * 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.
 */
export async function verifyOtp(phone: string, otp: string): Promise<SmsCenterResult<VerifyOtpData>> {
  const { baseUrl, appId, headers } = smsCenterConfig();
  const res = await fetch(`${baseUrl}/api/v1/otp/verify`, {
    method: 'POST',
    headers,
    body: JSON.stringify({ phone, otp, app_id: appId }),
  });
  const data = await res.json().catch(() => ({}));
  return { ok: res.ok, status: res.status, data };
}
