import {authFailure,AuthError} from '@/lib/customer-auth';
import {identitySession} from '@/lib/identity-server';
import {json,readJson,sameOrigin} from '@/lib/server';
import {tokenizationId,tokenizationVersion,tokenizationRpc} from '@/lib/tokenization-server';
import {validateAssetFields,getAssetType,TERMS_VERSION} from '@/lib/tokenization';
export async function GET(request:Request){try{const {token}=await identitySession(request);return json(await tokenizationRpc('marketplace_tokenization_state',{},token))}catch(e){return authFailure(e)}}
export async function POST(request:Request){try{
 if(!sameOrigin(request))throw new AuthError('درخواست نامعتبر است.',403);
 const {token}=await identitySession(request);let body:Record<string,unknown>;
 try{const parsed=await readJson(request,65536);if(!parsed||typeof parsed!=='object'||Array.isArray(parsed))throw new Error();body=parsed as Record<string,unknown>}catch{throw new AuthError('اطلاعات درخواست معتبر نیست یا حجم آن بیش از حد مجاز است.')}
 let payload:Record<string,unknown>;
 if(body.action==='start'){
  if(!getAssetType(String(body.asset_type))||body.consent!==true||body.terms_version!==TERMS_VERSION)throw new AuthError('نوع دارایی و پذیرش شرایط جاری لازم است.');
  payload={asset_type:body.asset_type,terms_version:TERMS_VERSION,consent:true};
 }else{
  if(!tokenizationId(body.id)||!tokenizationVersion(body.version))throw new AuthError('درخواست معتبر نیست.');payload={id:body.id,version:body.version};
  if(body.action==='save'){try{payload={...payload,asset_type:body.asset_type,fields:validateAssetFields(String(body.asset_type),body.fields,{partial:true})}}catch(e){throw new AuthError((e as Error).message)}}
  else if(body.action==='submit'&&body.consent===true)payload.consent=true;
  else if(body.action==='accept'&&body.consent===true&&tokenizationVersion(body.proposal_version)){payload.consent=true;payload.proposal_version=body.proposal_version}
  else throw new AuthError('درخواست پشتیبانی نمی‌شود.');
 }
 if(body.wizard_step!==undefined){
  if(!['start','save'].includes(String(body.action))||!Number.isInteger(body.wizard_step)||Number(body.wizard_step)<0||Number(body.wizard_step)>3)throw new AuthError('مرحلهٔ پیش‌نویس معتبر نیست.');
  payload.wizard_step=body.wizard_step;
 }
 return json(await tokenizationRpc('marketplace_tokenization_customer',{p_action:body.action,p_payload:payload},token));
}catch(e){return authFailure(e)}}
