import {authBody,authFailure,AuthError,authRequest} from '@/lib/customer-auth';
import {isAuthUser,setAuthCookie} from '@/lib/auth-cookies';
import {requireAccountAccess} from '@/lib/account-access-server';
import {db,json} from '@/lib/server';

export async function POST(request:Request){try{
 const body=await authBody(request);
 if(Object.keys(body).some(key=>!['request_id','access_token'].includes(key))||typeof body.request_id!=='string'||!/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(body.request_id)
 ||typeof body.access_token!=='string'||body.access_token.length>8000||!/^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/.test(body.access_token))throw new AuthError('لینک بازیابی معتبر نیست یا منقضی شده است.',401);
 const token=body.access_token;
 const {result,data}=await authRequest('user',undefined,token);
 if(!result.ok||!isAuthUser(data))throw new AuthError('لینک بازیابی معتبر نیست یا منقضی شده است.',401);
 // PostgREST verifies the same bearer and the RPC checks recipient, verified
 // email, request, one Auth session and recent OTP AMR. Never decode/trust a JWT
 // in the browser, or accept a password-login token as recovery proof.
 const claim=await db('rpc/marketplace_customer_password_recovery_claim',{method:'POST',body:JSON.stringify({p_id:body.request_id})},token);
 if(!claim.ok)throw new AuthError(claim.status===404?'اتصال بازیابی رمز هنوز آماده نیست. با پشتیبانی تماس بگیرید.':'لینک بازیابی معتبر نیست یا منقضی شده است.',claim.status===404?503:401);
 const target=await claim.json() as {user_id?:string;email?:string};
 if(target.user_id!==data.id||typeof target.email!=='string'||!target.email.includes('@'))throw new AuthError('لینک بازیابی معتبر نیست.',401);
 await requireAccountAccess(token,'login',data.id);
 const response=json({email:target.email});
 response.headers.set('Referrer-Policy','no-referrer');
 setAuthCookie(response,request,'planck_recovery',token,600,'/api/auth/recovery');
 return response;
}catch(error){return authFailure(error)}}
