import {authBody,authFailure,AuthError,authRequest,assertAuthResult,phoneReady,loginResponse} from '@/lib/customer-auth';
import {normalizeEmail,normalizePhone,normalizeUsername,validName,validPassword} from '@/lib/auth-input';
import {db,json} from '@/lib/server';
import {referralCode,referralCookie} from '@/lib/referrals';
import {registrationTestMode,directRegistrationTestMode,directTestRegistration,beginTestRegistration,hasTestRegistration,clearTestRegistration} from '@/lib/registration-sandbox';
export async function POST(request:Request){
 try{
  const body=await authBody(request);const phone=normalizePhone(body.phone),email=normalizeEmail(body.email);
  const username=body.username?normalizeUsername(body.username):null;
  if(!validName(body.firstName)||!validName(body.lastName)||!phone||!email)throw new AuthError('نام، نام خانوادگی، ایمیل و شماره موبایل معتبر را وارد کنید.');
  if(body.username&&!username)throw new AuthError('نام کاربری باید ۳ تا ۳۲ حرف انگلیسی، عدد یا زیرخط باشد و با حرف شروع شود.');
  if(!validPassword(body.password,true))throw new AuthError('رمز عبور باید بین ۱۲ تا ۲۵۶ نویسه باشد.');
  const rawRef=typeof body.referralCode==='string'?body.referralCode:referralCookie(request.headers.get('cookie')||'');
  const ref=referralCode(rawRef);
  if(rawRef&&!ref)throw new AuthError('کد دعوت معتبر نیست.');
  if(ref){const lookup=await db('rpc/marketplace_referral_lookup',{method:'POST',body:JSON.stringify({p_code:ref})});if(!lookup.ok)throw new AuthError('بررسی کد دعوت انجام نشد. دوباره تلاش کنید.',503);if(await lookup.json()!==true)throw new AuthError('کد دعوت پیدا نشد یا غیرفعال است.');}
  const metadata={first_name:body.firstName.trim(),last_name:body.lastName.trim(),contact_email:email,requested_username:username,marketplace_customer:true,...(ref?{referral_code:ref}:{})};
  if(directRegistrationTestMode(request)){
   const session=await directTestRegistration(request,{phone,password:body.password,metadata});
   const response=await loginResponse(request,session,body.remember===true,'حساب آزمایشی ساخته شد. تأیید پیامکی موقتاً غیرفعال است؛ برای ورود بعدی از شماره موبایل و رمز عبور استفاده کنید.');
   clearTestRegistration(response,request);return response;
  }
  if(registrationTestMode(request))return beginTestRegistration(request,{phone,password:body.password,metadata});
  await phoneReady();
  const {result,data}=await authRequest('signup',{
   phone,password:body.password,channel:'sms',
   data:metadata
  });
  assertAuthResult(result,data,'ثبت‌نام انجام نشد. اطلاعات را بررسی کنید یا وارد حساب قبلی شوید.');
  if(data.access_token)throw new AuthError('تأیید شماره موبایل در دسترس نیست. لطفاً بعداً تلاش کنید.',503);
  const response=json({phone,step:'verify'});if(hasTestRegistration(request))clearTestRegistration(response,request);return response;
 }catch(error){return authFailure(error)}
}
