import {type Project,type Category,type Locale,type Localized} from './catalog';
import {marketQuote,normalizeSearch,type MarketSort} from './market';
import {formatInvestmentAmount} from './investment-amount';
import {wallexAssets,wallexFresh,type WallexQuote,type WallexSymbol} from './wallex';
export type WallexAsset={kind:'wallex';id:string;slug:string;symbol:string;title:Localized;subtitle:Localized;location:Localized;category:Category;image_url:string;token_icon_url:string;sort_order:number;marketSymbol:WallexSymbol;quote?:WallexQuote};
export type MarketAsset=Project|WallexAsset;
export const isWallexAsset=(asset:MarketAsset):asset is WallexAsset=>'kind' in asset&&asset.kind==='wallex';
const images:Record<string,string>={USOON:'/images/digital-oil-daylight.png',XAUT:'/images/gold.jpg',COPXON:'/images/copper-token.svg'};
export function mergeMarketAssets(projects:Project[],quotes:WallexQuote[]):MarketAsset[]{
 const last=Math.max(0,...projects.map(p=>p.sort_order));
 return [...projects,...wallexAssets.map((a,i):WallexAsset=>({kind:'wallex',id:`wallex:${a.symbol}`,slug:`wallex-${a.base.toLowerCase()}`,symbol:a.base,title:{fa:a.title,en:a.description},subtitle:{fa:a.description,en:a.description},location:{fa:'بازار تومان',en:'Toman market'},category:a.key==='tether'?'investment':'tangible',image_url:images[a.base]||'',token_icon_url:images[a.base]||'',sort_order:last+i+1,marketSymbol:a.symbol,quote:quotes.find(q=>q.symbol===a.symbol&&wallexFresh(q))}))];
}
export function assetQuote(asset:MarketAsset,now=Date.now()){
 if(!isWallexAsset(asset))return marketQuote(asset,now);
 const q=asset.quote;if(!wallexFresh(q,now)||q.change24h===null)return null;
 const percent=Number(q.change24h);return {percent,direction:percent>0?'up':percent<0?'down':'flat',deltaRial:null,at:Date.parse(q.receivedAt)} as const;
}
export function assetPriceRial(asset:MarketAsset,now=Date.now()):number|null{
 if(!isWallexAsset(asset))return Number.isFinite(asset.unit_price_rial)&&asset.unit_price_rial>0?asset.unit_price_rial:null;
 return wallexFresh(asset.quote,now)?Number(asset.quote.price)*10:null;
}
export function assetPriceText(asset:MarketAsset,locale:Locale){
 if(isWallexAsset(asset))return wallexFresh(asset.quote)?formatInvestmentAmount(asset.quote.price,locale):'—';
 return formatInvestmentAmount(String(asset.unit_price_rial/10),locale);
}
export const assetHref=(asset:MarketAsset,preview=false)=>isWallexAsset(asset)?`/assets/${asset.marketSymbol}${preview?'?preview=design':''}`:`/projects/${asset.slug}${preview?'?preview=design':''}`;
export function filterMarketAssets(assets:MarketAsset[],query:string,category:string,sort:MarketSort,locale:Locale,now=Date.now()){
 const terms=normalizeSearch(query).split(/\s+/).filter(Boolean);
 return assets.filter(a=>(category==='all'||a.category===category)&&terms.every(term=>normalizeSearch([a.symbol,a.slug,...Object.values(a.title),...Object.values(a.subtitle),...Object.values(a.location)].join(' ')).includes(term))).sort((a,b)=>{
  if(sort==='price-low'||sort==='price-high'){const x=assetPriceRial(a,now),y=assetPriceRial(b,now);return x===null?y===null?a.sort_order-b.sort_order:1:y===null?-1:(sort==='price-low'?x-y:y-x)||a.sort_order-b.sort_order}
  if(sort==='gainers'||sort==='losers'){const x=assetQuote(a,now),y=assetQuote(b,now);return !x?y?1:a.sort_order-b.sort_order:!y?-1:(sort==='gainers'?y.percent-x.percent:x.percent-y.percent)||a.sort_order-b.sort_order}
  if(sort==='newest'){const date=(p:MarketAsset)=>isWallexAsset(p)?0:Date.parse(p.created_at||p.updated_at)||0;return date(b)-date(a)||a.sort_order-b.sort_order}
  return a.sort_order-b.sort_order;
 });
}
