import {AuthError, authFailure} from './customer-auth';
import {db, json} from './server';
import {TicketInputError} from './support-tickets';

const failures: Record<string, [number, string]> = {
  ticket_not_found: [404, 'تیکت مورد نظر پیدا نشد.'],
  ticket_version_conflict: [409, 'این گفتگو به‌روزرسانی شده است. تازه‌سازی کنید و دوباره پاسخ دهید.'],
  ticket_idempotency_conflict: [409, 'این درخواست قبلاً با اطلاعات دیگری ثبت شده است. صفحه را تازه‌سازی کنید.'],
  ticket_closed: [409, 'این تیکت بسته شده است. برای پیگیری، تیکت تازه‌ای ایجاد کنید.'],
  ticket_rate_limited: [429, 'تعداد درخواست‌ها زیاد است. کمی بعد دوباره تلاش کنید.'],
  invalid_ticket: [400, 'اطلاعات تیکت معتبر نیست. لطفاً ورودی‌ها را بررسی کنید.'],
  invalid_ticket_filter: [400, 'فیلترهای جست‌وجو معتبر نیست.'],
  not_authenticated: [401, 'برای مشاهده یا ارسال تیکت وارد حساب خود شوید.'],
  not_authorized: [403, 'اجازه دسترسی به این تیکت را ندارید.'],
  account_suspended: [403, 'حساب شما تعلیق شده است. با پشتیبانی تماس بگیرید.'],
  account_closed: [403, 'دسترسی به این حساب بسته شده است.'],
};
class TicketRpcError extends AuthError {
  code: string;
  constructor(code: string, status: number, message: string) {super(message, status);this.code = code;}
}
export async function ticketRpc(name: string, payload: unknown, token: string) {
  const response = await db('rpc/' + name, {method: 'POST', body: JSON.stringify(payload)}, token);
  const data = await response.json() as Record<string, unknown>;
  if (!response.ok) {
    const code = typeof data.message === 'string' ? data.message : '';
    const failure = failures[code];
    if (failure) throw new TicketRpcError(code, ...failure);
    // Database schema, stack traces and provider details never reach the browser.
    throw new TicketRpcError('ticket_service_unavailable', 503, 'دریافت یا ثبت تیکت انجام نشد. کمی بعد دوباره تلاش کنید.');
  }
  return data;
}
export function ticketFailure(error: unknown) {
  if (error instanceof TicketInputError) return json({error: error.message, code: 'invalid_ticket'}, 400);
  if (error instanceof TicketRpcError) return json({error: error.message, code: error.code}, error.status);
  return authFailure(error);
}
