package main

import "math/rand"

// WayfarerCommodity — один вид товара для торговли.
type WayfarerCommodity struct {
	Key            string
	BasePrice      float64
	IndustrialBias float64 // >0 — дешевле в промышленных системах, <0 — дешевле в аграрных
	WealthBias     float64 // >0 — дешевле в богатых системах, <0 — дешевле в бедных
	Illegal        bool    // патрули иногда проверяют такой груз
}

// WayfarerCommodities — список доступных для торговли товаров.
// Индекс в этом срезе используется как компактный идентификатор
// товара в трюме корабля.
var WayfarerCommodities = []WayfarerCommodity{
	{Key: "commodity.food", BasePrice: 12, IndustrialBias: -0.5, WealthBias: 0},
	{Key: "commodity.textiles", BasePrice: 18, IndustrialBias: -0.3, WealthBias: -0.1},
	{Key: "commodity.machinery", BasePrice: 65, IndustrialBias: 0.6, WealthBias: 0.1},
	{Key: "commodity.computers", BasePrice: 140, IndustrialBias: 0.5, WealthBias: 0.3},
	{Key: "commodity.luxuries", BasePrice: 220, IndustrialBias: 0, WealthBias: -0.6},
	{Key: "commodity.medicine", BasePrice: 90, IndustrialBias: 0.2, WealthBias: 0.2},
	{Key: "commodity.minerals", BasePrice: 35, IndustrialBias: 0.4, WealthBias: 0},
	{Key: "commodity.rare_metals", BasePrice: 310, IndustrialBias: 0.3, WealthBias: 0.4},
	{Key: "commodity.contraband", BasePrice: 260, IndustrialBias: 0, WealthBias: -0.4, Illegal: true},
	{Key: "commodity.firearms", BasePrice: 180, IndustrialBias: 0.3, WealthBias: 0, Illegal: true},
}

// wayfarerPriceNoise — насколько случайный шум может отклонить цену
// от расчётного значения (±15%).
const wayfarerPriceNoise = 0.15

// CommodityPrice вычисляет цену покупки товара commodityIdx в
// системе sys. rng используется для небольшого случайного разброса
// цены (тесты передают детерминированный источник).
func CommodityPrice(commodityIdx int, sys WayfarerSystem, rng *rand.Rand) float64 {
	c := WayfarerCommodities[commodityIdx]
	price := c.BasePrice
	price *= 1 - c.IndustrialBias*(sys.Industrial*2-1)*0.5
	price *= 1 - c.WealthBias*(sys.Wealth*2-1)*0.5

	noise := 1 + (rng.Float64()*2-1)*wayfarerPriceNoise
	price *= noise
	if price < 1 {
		price = 1
	}
	return price
}

// SellPrice — цена продажи (обычно чуть ниже цены покупки — так
// станция зарабатывает на посреднической марже, как в привычных
// торговых играх).
func SellPrice(buyPrice float64) float64 {
	return buyPrice * 0.9
}
