import {db} from './server';
import {parseAccountAccess,accessRestriction,type AccountAccess,type AccountCapability} from './account-access';
export class AccountAccessError extends Error {
 status:number; code:string; access:AccountAccess|null;
 constructor(message:string,status=503,access:AccountAccess|null=null,code='account_access_unavailable'){super(message);this.name='AccountAccessError';this.status=status;this.code=code;this.access=access;}
}
export async function readAccountAccess(token:string,expectedUser?:string):Promise<AccountAccess>{
 if(!token)throw new AccountAccessError('ابتدا وارد حساب شوید.',401,null,'not_authenticated');
 try{
  const response=await db('rpc/marketplace_my_access',{method:'POST',body:'{}',signal:AbortSignal.timeout(7000)},token);
  if(!response.ok)throw new AccountAccessError(accessRestriction(null),response.status===401?401:503);
  const access=parseAccountAccess(await response.json(),expectedUser);
  if(!access)throw new AccountAccessError(accessRestriction(null));
  return access;
 }catch(error){if(error instanceof AccountAccessError)throw error;throw new AccountAccessError(accessRestriction(null));}
}
export async function requireAccountAccess(token:string,capability:AccountCapability='login',expectedUser?:string){
 const access=await readAccountAccess(token,expectedUser),message=accessRestriction(access,capability);
 if(message)throw new AccountAccessError(message,403,access,access.status!=='active'?'account_'+access.status:capability+'_disabled');
 return access;
}
