import {applicationOrigin} from '@/lib/application-origin';
import {activeCustomerSession, authBody, authFailure, AuthError} from '@/lib/customer-auth';
import {db, env, json} from '@/lib/server';
import {createTcarttService, TcarttServiceError} from '@/lib/tcartt-payment-service';

const messages: Record<string, string> = {
  invalid_request: 'اطلاعات درخواست واریز معتبر نیست.',
  invalid_amount: 'حداقل واریز تیکارت ۱٬۰۰۰ تومان است. مبلغ را به تومان و با عدد صحیح وارد کنید.',
  payment_not_found: 'درخواستی با این شناسه برای حساب شما ثبت نشده است.',
  payment_rate_limit: 'تعداد درخواست‌ها زیاد است. کمی بعد دوباره تلاش کنید.',
  payment_request_conflict: 'مبلغ این درخواست تغییر کرده است. ابتدا وضعیت درخواست قبلی را بررسی کنید.',
  payment_verification_mismatch: 'اطلاعات استعلام پرداخت با درخواست مطابقت ندارد. برای بررسی با پشتیبانی تماس بگیرید.',
  tcartt_not_configured: 'پرداخت کارت‌به‌کارت تیکارت هنوز فعال نشده است.',
  tcartt_database_not_ready: 'اتصال ثبت واریز تیکارت هنوز آماده نشده است.',
  tcartt_server_not_configured: 'اتصال امن پرداخت هنوز آماده نشده است.',
  tcartt_provider_not_ready: 'دسترسی پذیرنده تیکارت هنوز آماده نیست. با پشتیبانی تماس بگیرید.',
  tcartt_provider_unavailable: 'ارتباط با تیکارت برقرار نشد. وضعیت همین درخواست را دوباره بررسی کنید.',
  tcartt_creation_unknown: 'نتیجه ساخت درخواست هنوز مشخص نیست. برای جلوگیری از پرداخت تکراری، وضعیت همین درخواست را بررسی کنید؛ در صورت ادامه مشکل با پشتیبانی تماس بگیرید.',
  contact_not_verified: 'ابتدا اطلاعات تماس حساب خود را تأیید کنید.',
  customer_account_suspended: 'حساب شما تعلیق شده است. با پشتیبانی تماس بگیرید.',
  customer_account_closed: 'این حساب بسته شده است.',
};
function failure(error: unknown) {
  if (error instanceof TcarttServiceError) return json({error: messages[error.code] || 'بررسی واریز انجام نشد. پیش از پرداخت دوباره، وضعیت همین درخواست را پیگیری کنید.', code: error.code}, error.status);
  return authFailure(error);
}
function service() {return createTcarttService({url: env('SUPABASE_URL'), key: env('SUPABASE_SERVICE_ROLE_KEY')});}

export async function GET(request: Request) {
  try {
    const {token} = await activeCustomerSession(request);
    const response = await db('rpc/marketplace_tcartt_status', {method: 'POST', body: '{}'}, token);
    const data = await response.json().catch(() => null) as Record<string, unknown> | null;
    if (!response.ok) {
      if (data?.code === 'PGRST202') return json({ready: false, configured: false});
      throw new AuthError('وضعیت اتصال کارت‌به‌کارت دریافت نشد. دوباره تلاش کنید.', 503);
    }
    if (!data || data.provider !== 'tcartt' || typeof data.configured !== 'boolean' || typeof data.enabled !== 'boolean') throw new AuthError('وضعیت اتصال کارت‌به‌کارت معتبر نیست.', 503);
    // Configuration is not proof of a live payment. Missing server credentials
    // always disables creation, even if the owner enabled the provider in the UI.
    return json({ready: data.enabled && data.configured && Boolean(env('SUPABASE_SERVICE_ROLE_KEY')), configured: data.configured});
  } catch (error) {return failure(error);}
}

export async function POST(request: Request) {
  try {
    const body = await authBody(request);
    const {userId} = await activeCustomerSession(request);
    const origin = applicationOrigin(request);
    const allowed = (env('TCARTT_ALLOWED_ORIGINS') || (process.env.NODE_ENV === 'production' ? origin : 'http://localhost:3000,http://127.0.0.1:3000')).split(',').map(value => value.trim());
    if (!allowed.includes(origin)) throw new AuthError('پرداخت برای این نشانی سایت فعال نشده است.', 403);
    if (body.action === 'start' && Object.keys(body).every(key => ['action', 'requestId', 'amountToman'].includes(key)) && typeof body.requestId === 'string' && typeof body.amountToman === 'string') {
      return json(await service().start(userId, {requestId: body.requestId, amountToman: body.amountToman}, origin));
    }
    if (body.action === 'status' && Object.keys(body).every(key => ['action', 'paymentId', 'requestId'].includes(key))
      && (body.paymentId === undefined || typeof body.paymentId === 'string') && (body.requestId === undefined || typeof body.requestId === 'string')) {
      return json(await service().status(userId, {paymentId: body.paymentId as string | undefined, requestId: body.requestId as string | undefined}));
    }
    throw new TcarttServiceError('invalid_request', 400);
  } catch (error) {return failure(error);}
}
