import {applicationOrigin} from '@/lib/application-origin';
import {requireAccountAccess} from '@/lib/account-access-server';
import {AuthError,authFailure,authRequest} from '@/lib/customer-auth';
import {cookieValue,isAuthUser} from '@/lib/auth-cookies';
import {env,json,sameOrigin,readJson} from '@/lib/server';
import {walletAddress,walletChain} from '@/supabase/functions/_shared/wallet-link';
export async function GET(){
 const projectId=env('WALLETCONNECT_PROJECT_ID');
 return json({projectId:/^[a-f0-9]{32}$/i.test(projectId)?projectId:null});
}
export async function POST(request:Request){
 try{
  if(!sameOrigin(request)||request.headers.get('sec-fetch-site')==='cross-site')throw new AuthError('درخواست نامعتبر است.',403);
  const token=cookieValue(request,'planck_session');if(!token)throw new AuthError('ابتدا وارد حساب شوید.',401);
  if(!request.headers.get('content-type')?.startsWith('application/json'))throw new AuthError('درخواست نامعتبر است.',415);
  const {result,data}=await authRequest('user',undefined,token);if(!result.ok||!isAuthUser(data))throw new AuthError('دوباره وارد حساب شوید.',401);
  await requireAccountAccess(token,'login',data.id);
  let body;try{body=await readJson(request,8000) as Record<string,unknown>}catch{throw new AuthError('درخواست نامعتبر است.')}
  if(!body||typeof body!=='object')throw new AuthError('درخواست نامعتبر است.');
  let payload:Record<string,unknown>;
  if(body.action==='challenge'&&walletAddress(body.address)&&walletChain(body.chainId))payload={action:'challenge',address:body.address,chainId:body.chainId,label:typeof body.label==='string'?body.label.slice(0,60):'Public wallet'};
  else if(body.action==='verify'&&typeof body.id==='string'&&/^[0-9a-f-]{36}$/i.test(body.id)&&typeof body.signature==='string'&&/^0x[0-9a-f]{130}$/i.test(body.signature))payload={action:'verify',id:body.id,signature:body.signature};
  else throw new AuthError('اطلاعات والت معتبر نیست.');
  payload.origin=applicationOrigin(request);
  const response=await fetch(`${env('SUPABASE_URL')}/functions/v1/wallet-link`,{method:'POST',cache:'no-store',headers:{apikey:env('SUPABASE_PUBLISHABLE_KEY'),Authorization:`Bearer ${token}`,'Content-Type':'application/json'},body:JSON.stringify(payload),signal:AbortSignal.timeout(20000)});
  const value=await response.json() as {error?:string};
  if(!response.ok){const allowed=['wallet_rate_limit','wallet_challenge_expired','wallet_already_linked','wallet_limit','invalid_signature','origin_not_allowed','unauthorized'];return json({error:allowed.includes(value?.error||'')?value.error:'wallet_unavailable'},[400,401,403,409,429].includes(response.status)?response.status:503)}
  return json(value);
 }catch(error){return authFailure(error)}
}
