from __future__ import annotations

import collections
import dataclasses
import typing

import cache
from config import config
import market

if typing.TYPE_CHECKING:
	import supply

def main() -> None:
	raw_prices: typing.Mapping[str, market.RawPrice] = {p['MaterialTicker']: p
			for p in cache.get('https://refined-prun.github.io/refined-prices/all.json') if p['ExchangeCode'] == 'IC1'}

	planets: typing.Sequence[supply.FIOBurn] = cache.get('https://rest.fnar.net/fioweb/burn/user/' + config.username,
			headers={'Authorization': config.fio_api_key})
	producing = frozenset(mat['MaterialTicker'] for planet in planets for mat in planet['OrderProduction']
			if mat['MaterialTicker'] not in (c['MaterialTicker'] for c in planet['OrderConsumption']))
	materials: list[Material] = []
	for mat in producing:
		price = raw_prices[mat]
		if price['Bid'] is None or price['Ask'] is None:
			print(mat, 'has no bid/ask')
			continue
		spread = (price['Ask'] - price['Bid']) / price['Ask']
		chart_analysis = market.analyze_price_chart(mat + '.IC1', (price['Bid'] + price['Ask']) / 2)
		ask_fill_ratio = chart_analysis.asks_filled / (chart_analysis.bids_filled + chart_analysis.asks_filled)
		materials.append(Material(mat, spread=spread, bid=price['Bid'], ask=price['Ask'], score=spread * ask_fill_ratio))
	materials.sort()

	all_orders: typing.Sequence[market.ExchangeOrder] = cache.get('https://rest.fnar.net/cxos/' + config.username,
			headers={'Authorization': config.fio_api_key})
	orders: dict[str, int] = collections.defaultdict(int)
	for order in all_orders:
		if order['OrderType'] != 'SELLING' or order['Status'] == 'FILLED' or order['ExchangeCode'] != 'IC1':
			continue
		orders[order['MaterialTicker']] += order['Amount']

	print(f'{"mat":^4} spread  asks  instant cash  loss')
	for m in materials:
		print(f'{m.ticker:4} {m.spread*100:5.1f}%', end='')
		if asks := orders.pop(m.ticker, None):
			print(f' {asks:5} {asks * m.bid:13} {asks * (m.ask - m.bid):5}')
		else:
			print()
	print('\nother listings:')
	for mat, asks in orders.items():
		print(f'{mat:4} {asks:5}')

@dataclasses.dataclass(eq=False, slots=True)
class Material:
	ticker: str
	spread: float
	bid: float
	ask: float
	score: float

	def __lt__(self, o) -> bool:
		return self.score < o.score


if __name__ == '__main__':
	main()
