import {applicationOrigin} from '@/lib/application-origin';
import {activeCustomerSession} from '@/lib/customer-auth';
import {authBody,authFailure,AuthError} from '@/lib/customer-auth';
import {depositAmountRial} from '@/lib/cash-wallet';
import {db,env,json} from '@/lib/server';
import {baleGatewayInput,balePayment,balePaymentError,tomanDepositInput,tomanDepositHistoryQuery,tomanDepositError} from '@/lib/toman-deposit';
async function session(request:Request){const state=await activeCustomerSession(request);return state.token;}
async function rpc(name:string,params:Record<string,unknown>,token:string){
 const response=await db('rpc/'+name,{method:'POST',body:JSON.stringify(params)},token);
 const payload=await response.json().catch(()=>null) as Record<string,unknown>|null;
 if(!response.ok){const [message,status]=tomanDepositError(payload?.code==='PGRST202'?'PGRST202':typeof payload?.message==='string'?payload.message:'');throw new AuthError(message,status)}
 if(!payload||typeof payload!=='object'||Array.isArray(payload))throw new AuthError('پاسخ سرویس واریز معتبر نیست.',503);
 return payload;
}
async function gatewaySettings(token:string){
 // A missing migration or an unavailable provider must not block manual deposits.
 try{
  const response=await db('rpc/marketplace_bale_status',{method:'POST',body:'{}'},token);
  const value=await response.json().catch(()=>null) as {enabled?:unknown;ready?:unknown;test_mode?:unknown;provider?:unknown}|null;
  if(response.ok&&value?.provider==='bale'&&typeof value.test_mode==='boolean')return {enabled:value.enabled===true&&value.ready===true,provider:'bale' as const,gateway:{ready:value.ready===true,testMode:value.test_mode}};
 }catch{}
 return {enabled:false,provider:null,gateway:{ready:false,testMode:false}};
}
export async function GET(request:Request){try{
 const token=await session(request);let params;
 try{params=tomanDepositHistoryQuery(new URL(request.url))}catch(e){throw new AuthError((e as Error).message)}
 const [state,r,gateway]=await Promise.all([rpc('marketplace_toman_deposit_state',params,token),db('rpc/marketplace_deposit_history',{method:'POST',body:'{}'},token),gatewaySettings(token)]);
 if(!r.ok)throw new AuthError('دریافت سوابق شارژ انجام نشد. دوباره تلاش کنید.',503);
 return json({...state,...gateway,deposits:await r.json()});
}catch(e){return authFailure(e)}}
export async function POST(request:Request){try{
 const body=await authBody(request);const token=await session(request);
 if(body.action==='start_gateway'||body.action==='gateway_status'){
  let input;try{input=baleGatewayInput(body)}catch(e){throw new AuthError((e as Error).message)}
  const response=await fetch(`${env('SUPABASE_URL').replace(/\/$/,'')}/functions/v1/bale-payments`,{method:'POST',cache:'no-store',headers:{apikey:env('SUPABASE_PUBLISHABLE_KEY'),Authorization:`Bearer ${token}`,'Content-Type':'application/json'},body:JSON.stringify({...input,origin:applicationOrigin(request)}),signal:AbortSignal.timeout(20000)});
  const value=await response.json().catch(()=>null) as Record<string,unknown>|null;
  if(!response.ok){const [message,status]=balePaymentError(value?.error);throw new AuthError(message,status)}
  const payment=balePayment(value);
  if(!payment||(input.action==='status'&&payment.paymentId!==input.paymentId))throw new AuthError('پاسخ درگاه معتبر نیست. وضعیت پرداخت را دوباره بررسی کنید.',503);
  return json(payment);
 }
 // Preserve the unavailable legacy gateway endpoint; never interpret a browser
 // success flag as a payment, redirect or balance credit.
 if(body.action===undefined){if(!depositAmountRial(body.amountToman))throw new AuthError('مبلغ شارژ را به تومان و با عدد صحیح مثبت وارد کنید.');return json({error:'درگاه شارژ هنوز متصل نشده است.'},503)}
 let input;try{input=tomanDepositInput(body)}catch(e){throw new AuthError((e as Error).message)}
 return json(await rpc(input.rpc,input.params,token));
}catch(e){return authFailure(e)}}
