import {fundingAmount,fundingId} from './wallet-funding';

export type FundingReview={test_mode:boolean;id:string;source_id:string;kind:'demo'|'usdt'|'bale'|'toman'|'withdrawal';direction:'deposit'|'withdrawal';amount:string;currency:'IRR'|'USDT';status:'pending'|'approved'|'rejected'|'problem';version:number;automatic_enabled:boolean;manual_required:boolean;created_at:string;updated_at:string;review_note:string;verification_status:'unverified'|'verified'|'not_required';execution_status:'awaiting_review'|'credited'|'reserved'|'awaiting_payout'|'released';checks:{key:string;label:string;status:'passed'|'pending'|'failed';detail:string}[]};
const obj=(v:unknown):Record<string,unknown>=>{if(!v||typeof v!=='object'||Array.isArray(v))throw new Error('invalid_funding_response');return v as Record<string,unknown>};
const bounded=(v:unknown,max:number)=>{if(typeof v!=='string'||v.length>max)throw new Error('invalid_funding_response');return v};
const date=(v:unknown)=>{const s=bounded(v,50);if(!Number.isFinite(Date.parse(s)))throw new Error('invalid_funding_response');return s};
export function fundingReviewView(value:unknown):FundingReview{
 const d=obj(value);
 if(typeof d.test_mode!=='boolean'||!fundingId(d.id)||!fundingId(d.source_id)||!['demo','usdt','bale','toman','withdrawal'].includes(String(d.kind))||!['deposit','withdrawal'].includes(String(d.direction))||!['IRR','USDT'].includes(String(d.currency))||typeof d.amount!=='string'||!/^\d{1,30}(?:\.\d{1,18})?$/.test(d.amount)||!['pending','approved','rejected','problem'].includes(String(d.status))||typeof d.version!=='number'||!Number.isSafeInteger(d.version)||d.version<0||typeof d.automatic_enabled!=='boolean'||typeof d.manual_required!=='boolean'||!['unverified','verified','not_required'].includes(String(d.verification_status))||!['awaiting_review','credited','reserved','awaiting_payout','released'].includes(String(d.execution_status))||!Array.isArray(d.checks)||d.checks.length>20)throw new Error('invalid_funding_response');
 return {test_mode:d.test_mode,id:d.id,source_id:d.source_id,kind:d.kind as FundingReview['kind'],direction:d.direction as FundingReview['direction'],amount:d.amount,currency:d.currency as FundingReview['currency'],status:d.status as FundingReview['status'],version:d.version,automatic_enabled:d.automatic_enabled,manual_required:d.manual_required,created_at:date(d.created_at),updated_at:date(d.updated_at),review_note:bounded(d.review_note??'',2000),verification_status:d.verification_status as FundingReview['verification_status'],execution_status:d.execution_status as FundingReview['execution_status'],checks:d.checks.map(value=>{const c=obj(value);if(!['passed','pending','failed'].includes(String(c.status)))throw new Error('invalid_funding_response');return {key:bounded(c.key,80),label:bounded(c.label,200),status:c.status as 'passed'|'pending'|'failed',detail:bounded(c.detail??'',2000)}})};
}
export function fundingHistoryView(value:unknown){const d=obj(value);if(!Array.isArray(d.items)||d.items.length>100)throw new Error('invalid_funding_response');return {items:d.items.map(fundingReviewView)}}
export function withdrawalInput(value:unknown){const d=obj(value);if(Object.keys(d).some(k=>!['request_id','amount_toman','bank_id'].includes(k))||!fundingId(d.request_id)||!fundingId(d.bank_id))throw new Error('invalid_funding_input');return {p_request:d.request_id,p_amount_rial:(BigInt(fundingAmount(d.amount_toman,0,'100000000'))*BigInt(10)).toString(),p_bank:d.bank_id}}
export const fundingKind={demo:'واریز آزمایشی',usdt:'واریز تتر',bale:'درگاه بله',toman:'واریز بانکی',withdrawal:'برداشت تومان'};
export const fundingStatus={pending:'در انتظار',approved:'تأییدشده',rejected:'ردشده',problem:'نیازمند بررسی'};
export const fundingExecution={awaiting_review:'در انتظار بررسی و تأیید',credited:'موجودی شارژ شد',reserved:'مبلغ برای برداشت رزرو شده',awaiting_payout:'تأیید مدیر · در انتظار انتقال وجه',released:'مبلغ رزروشده آزاد شد'};
