import type {AccountAccessSummary} from './account-access';
import type {CustomerUser} from './auth-input';
import type {DashboardData} from './dashboard';
import type {Locale} from './catalog';
import type {VerificationMetadata} from './identity-presentation';
import {MEMBER_PREVIEW_CHANNEL} from './member-preview-origin';

export const MEMBER_PREVIEW_LIFETIME=15_000;
export type MemberPreviewData={
 user:Pick<CustomerUser,'id'|'name'|'email'|'phone'|'username'>;
 account:DashboardData['account'];
 preferences:{locale:Locale;theme:'dark'|'light';reduced_motion:boolean};
 identity:{request:(VerificationMetadata&{id:string;status:string;verification_level?:string;final_approved_level?:string|null;verified_at?:string|null;final_decided_at?:string|null})|null};
 access:AccountAccessSummary;
 hasBankOwnership:boolean;
 fetchedAt:string;
};
type Row=Record<string,unknown>;
const row=(v:unknown):v is Row=>!!v&&typeof v==='object'&&!Array.isArray(v);
const string=(v:unknown)=>typeof v==='string'&&v.length<=1000;
const optionalString=(v:unknown)=>v===undefined||v===null||string(v);
const uuid=(v:unknown)=>typeof v==='string'&&/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(v);
export function validMemberPreview(value:unknown):value is MemberPreviewData{
 if(!row(value)||!row(value.user)||!row(value.account)||!row(value.preferences)||!row(value.identity))return false;
 const {user,account,preferences,identity}=value,access=value.access;
 if(!row(access)||!['active','suspended','closed'].includes(String(access.status))||typeof access.trading_enabled!=='boolean'||typeof access.withdrawals_enabled!=='boolean'||!Number.isSafeInteger(access.version)||Number(access.version)<0)return false;
 if(!uuid(user.id)||!string(user.name)||!optionalString(user.email)||!optionalString(user.phone)||!optionalString(user.username))return false;
 if(!['first_name','last_name','verification_status','account_level','created_at'].every(key=>string(account[key])))return false;
 if(!['birth_date','national_id','national_id_last4','updated_at','temporary_expires_at'].every(key=>optionalString(account[key])))return false;
 if(!['fa','en','ar'].includes(String(preferences.locale))||!['dark','light'].includes(String(preferences.theme))||typeof preferences.reduced_motion!=='boolean')return false;
 if(typeof value.hasBankOwnership!=='boolean'||!string(value.fetchedAt)||!Number.isFinite(Date.parse(value.fetchedAt as string)))return false;
 const request=identity.request;
 return request===null||(row(request)&&uuid(request.id)&&string(request.status)&&['verification_level','final_approved_level','verified_at','final_decided_at','temporary_expires_at'].every(key=>optionalString(request[key])));
}

/** A fresh frame is bound to one member; delayed, replayed and cross-frame messages cannot replace it. */
export function acceptMemberPreviewMessage(value:unknown,frameId:string,lastSequence:number,boundUserId:string|null){
 if(!row(value)||value.channel!==MEMBER_PREVIEW_CHANNEL||value.frameId!==frameId||!Number.isSafeInteger(value.sequence)||Number(value.sequence)<=lastSequence)return null;
 const sequence=Number(value.sequence);
 if(value.type==='clear')return {type:'clear' as const,sequence,message:string(value.message)?value.message as string:'نمای پروفایل بسته شد.'};
 if(value.type!=='snapshot'||!validMemberPreview(value.payload)||(boundUserId&&value.payload.user.id!==boundUserId))return null;
 const image=value.avatarData;
 const avatar=typeof image==='string'&&image.length<=2_800_000&&/^data:image\/(png|jpeg|webp);base64,[a-z0-9+/=]+$/i.test(image)?image:null;
 return {type:'snapshot' as const,sequence,payload:value.payload,avatar};
}
export function memberPreviewExpired(receivedAt:number,now:number){return receivedAt>0&&now-receivedAt>=MEMBER_PREVIEW_LIFETIME;}
