"""shared factor definitions for experimental designs"""
import numpy as np
from dataclasses import dataclass

@dataclass
class Factor:
    name: str
    levels: list
    primary: bool = True  # full cross vs sampled

# demand functions with compatible signatures
def demand_linear(mu, sigma, size): return np.maximum(0, np.random.normal(mu, sigma, size))
def demand_uniform(mu, sigma, size): return np.random.uniform(mu - sigma, mu + sigma, size)
def demand_exponential(mu, sigma, size): return np.random.exponential(mu, size)
def demand_logistic(mu, sigma, size): return np.random.logistic(mu, sigma, size)

DEMAND_FUNCTIONS = {
    "linear": demand_linear,
    "uniform": demand_uniform,
    "exponential": demand_exponential,
    "logistic": demand_logistic,
}

FACTORS = [
    Factor("demand_fn", list(DEMAND_FUNCTIONS.keys()), primary=True),
    Factor("alpha", [0.1, 0.3, 0.5, 0.7], primary=True),
    Factor("n_products", [5, 15, 30, 50], primary=True),
    Factor("demand_mu", [30.0, 50.0, 70.0], primary=False),
    Factor("demand_sigma", [5.0, 10.0, 20.0], primary=False),
    Factor("N", [100, 500, 1000], primary=False),
]

SEEDS_PER_CONFIG = 5
