/** Public, explicitly projected payment data. Credentials never belong in this shape. */
export type TcarttPayment = {
  paymentId: string;
  status: 'created' | 'pending' | 'pending_review' | 'credited' | 'failed' | 'cancelled' | 'expired' | 'creation_unknown';
  url: string | null;
  baseAmountRial: string;
  amountRial: string;
  expiresAt: string | null;
  trackingCode: string | null;
  reviewDecision: 'pending' | 'approved' | 'rejected' | 'problem' | null;
};
export type TcarttAvailability = {ready: boolean; configured: boolean};
const object = (value: unknown): value is Record<string, unknown> => !!value && typeof value === 'object' && !Array.isArray(value);
export const isTcarttId = (value: unknown): value is string => typeof value === 'string' && /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);
const amount = (value: unknown): value is string => typeof value === 'string' && /^\d{1,16}$/.test(value) && BigInt(value) > BigInt(0) && BigInt(value) <= BigInt(Number.MAX_SAFE_INTEGER) && BigInt(value) % BigInt(10) === BigInt(0);

export function tcarttPaymentUrl(value: unknown): string | null {
  if (typeof value !== 'string' || value.length > 1000) return null;
  try {
    const url = new URL(value);
    if (url.protocol !== 'https:' || !['www.tcartt.com', 'tcartt.com'].includes(url.hostname) || url.port || url.username || url.password || url.hash
      || !/^\/order\/[1-9]\d*$/.test(url.pathname) || [...url.searchParams.keys()].length !== 1 || !url.searchParams.has('t')
      || !/^[A-Za-z0-9_.~-]{1,512}$/.test(url.searchParams.get('t') || '')) return null;
    return url.href;
  } catch {return null;}
}

export function tcarttAvailability(value: unknown): TcarttAvailability | null {
  if (!object(value) || typeof value.ready !== 'boolean' || typeof value.configured !== 'boolean') return null;
  return {ready: value.ready && value.configured, configured: value.configured};
}

export function tcarttPayment(value: unknown): TcarttPayment | null {
  if (!object(value) || !isTcarttId(value.paymentId) || typeof value.status !== 'string' || !['created', 'pending', 'pending_review', 'credited', 'failed', 'cancelled', 'expired', 'creation_unknown'].includes(value.status)
    || !amount(value.baseAmountRial) || !amount(value.amountRial) || BigInt(value.amountRial) < BigInt(value.baseAmountRial)) return null;
  const url = value.url === null || value.url === undefined ? null : tcarttPaymentUrl(value.url);
  if (value.url !== null && value.url !== undefined && !url) return null;
  if (value.expiresAt !== null && value.expiresAt !== undefined && (typeof value.expiresAt !== 'string' || value.expiresAt.length > 50 || !Number.isFinite(Date.parse(value.expiresAt)))) return null;
  if (value.trackingCode !== null && value.trackingCode !== undefined && (typeof value.trackingCode !== 'string' || !/^[A-Za-z0-9_-]{1,100}$/.test(value.trackingCode))) return null;
  if (value.reviewDecision !== null && value.reviewDecision !== undefined && (typeof value.reviewDecision !== 'string' || !['pending', 'approved', 'rejected', 'problem'].includes(value.reviewDecision))) return null;
  return {paymentId: value.paymentId, status: value.status as TcarttPayment['status'], url, baseAmountRial: value.baseAmountRial, amountRial: value.amountRial,
    expiresAt: typeof value.expiresAt === 'string' ? value.expiresAt : null, trackingCode: typeof value.trackingCode === 'string' ? value.trackingCode : null,
    reviewDecision: value.reviewDecision as TcarttPayment['reviewDecision'] ?? null};
}
