import {env,json,readJson} from '@/lib/server';
import {tokenizationId} from '@/lib/tokenization-server';
import {issuanceConfig,workerAuthorized,verifyMintReceipt,IssuanceError,type IssuanceJob} from '@/lib/tokenization-issuance';

/** Server-to-server receipt callback. No cookie or browser administrator can finalize. */
export async function POST(request:Request){try{
 const secret=env('TOKENIZATION_WORKER_SECRET'),serviceKey=env('SUPABASE_SERVICE_ROLE_KEY');
 if(!secret||!serviceKey||!env('SUPABASE_URL'))throw new IssuanceError('اتصال تأیید صدور هنوز فعال نشده است.',503);
 if(!await workerAuthorized(request,secret))throw new IssuanceError('دسترسی مجاز نیست.',401);
 let b:Record<string,unknown>;try{const data=await readJson(request,2048);if(!data||typeof data!=='object'||Array.isArray(data))throw new Error();b=data as Record<string,unknown>}catch{throw new IssuanceError('درخواست معتبر نیست.',400)}
 if(!tokenizationId(b.id)||typeof b.transaction_hash!=='string'||!/^0x[0-9a-f]{64}$/i.test(b.transaction_hash)||Object.keys(b).some(k=>!['id','transaction_hash'].includes(k)))throw new IssuanceError('درخواست معتبر نیست.',400);
 const serviceRpc=async(name:string,body:Record<string,unknown>)=>{const r=await fetch(`${env('SUPABASE_URL').replace(/\/$/,'')}/rest/v1/rpc/${name}`,{method:'POST',cache:'no-store',headers:{apikey:serviceKey,Authorization:`Bearer ${serviceKey}`,'Content-Type':'application/json'},body:JSON.stringify(body),signal:AbortSignal.timeout(15000)});if(!r.ok)throw new IssuanceError('ثبت رسید انجام نشد؛ وضعیت و تنظیمات صدور را بررسی کنید.',r.status>=500?503:409);return await r.json() as Record<string,unknown>};
 const data=await serviceRpc('marketplace_tokenization_issuance_job',{p_id:b.id}),job=data.job as IssuanceJob|undefined;
 if(!job)throw new IssuanceError('درخواست صدور یافت نشد.',404);
 if(job.status==='confirmed'){
  if(job.receipt?.transaction_hash!==b.transaction_hash.toLowerCase())throw new IssuanceError('برای این درخواست رسید دیگری ثبت شده است.');
  return json({id:b.id,status:'confirmed',already_processed:true});
 }
 const config=issuanceConfig(env('TOKENIZATION_ISSUANCE_CONFIG'),b.id),receipt=await verifyMintReceipt(job,config,b.transaction_hash);
 await serviceRpc('marketplace_tokenization_issuance_bind',{p_id:b.id,p_proposal_version:job.proposal_version,p_chain_id:String(config.chainId),p_contract:config.contractAddress,p_recipient:config.custodyAddress});
 const result=await serviceRpc('marketplace_tokenization_issuance_finalize',{p_id:b.id,p_proposal_version:job.proposal_version,p_receipt:receipt});return json(result);
}catch(e){return e instanceof IssuanceError?json({error:e.message},e.status):json({error:'پاسخ تأیید صدور دریافت نشد. وضعیت درخواست را دوباره بررسی کنید.'},503)}}
