from __future__ import annotations

import collections
import json
import math
import sys
import typing

import cache
from config import config
import market
import supply

if typing.TYPE_CHECKING:
	import supply

def main() -> None:
	(ship,) = sys.argv[1:]
	ship_inventory = get_ship_storage(ship)
	warehouse_inventory = supply.warehouse_inventory()
	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'}
	consumption = get_consumption()

	to_sell: dict[str, int] = {}
	price_limits: dict[str, int] = {}
	for item in ship_inventory:
		if item['Type'] == 'SHIPMENT':
			continue
		ticker = item['MaterialTicker']
		print(f'{item["MaterialAmount"]:5} {ticker:3}:', end=' ')
		have = item['MaterialAmount'] + warehouse_inventory.get(ticker, 0)
		need = math.ceil(consumption.get(ticker, 0) * 14)
		sell = min(have - need, item['MaterialAmount'])
		keep = item['MaterialAmount'] - sell
		if sell > 0:
			print('sell', sell, end=' ')
			to_sell[ticker] = sell
			ask = raw_prices[ticker]['Ask']
			if ask is None:
				print('(NO ASK)', end=' ')
			else:
				epsilon = 10 ** (int(math.log10(ask)) - 2)
				price_limits[ticker] = ask - 2 * epsilon
		if keep > 0:
			print('keep', keep, end= ' ')
		print()

	print('\n' + json.dumps({
		'global': {'name': 'sell ' + ship},
		'groups': [{'type': 'Manual', 'name': 'A1', 'materials': to_sell}],
		'actions': [
			{'name': 'sell', 'type': 'CX Sell', 'group': 'A1', 'exchange': 'IC1', 'origin': ship + ' Cargo',
				'priceLimits': price_limits, 'sellPartial': True, 'allowUnfilled': True},
		],
	}))

def get_ship_storage(ship_name: str) -> typing.Sequence[market.StorageItem]:
	ship_name = ship_name.casefold()
	stores: typing.Sequence[market.Storage] = cache.get('https://rest.fnar.net/storage/' + config.username,
			headers={'Authorization': config.fio_api_key})
	for store in stores:
		if store['Type'] == 'SHIP_STORE' and store['Name'].casefold() == ship_name:
			return store['StorageItems']
	raise Exception(f'ship storage {ship_name} not found')

def get_consumption() -> typing.Mapping[str, float]:
	'''get consumption on planets that consume each mat'''
	planets = [supply.Planet(fio_burn) for fio_burn in cache.get('https://rest.fnar.net/fioweb/burn/user/' + config.username,
			headers={'Authorization': config.fio_api_key})]

	consumption: dict[str, float] = collections.defaultdict(float)
	for planet in planets:
		supply_config = config.supply_config(planet.name)
		for mat, amount in planet.net_consumption.items():
			if mat not in supply_config.ignore_materials and amount > 0:
				consumption[mat] += amount
	return consumption


if __name__ == '__main__':
	main()
