from __future__ import annotations from models.config import BotConfig, RateConfig from models.pricing import CookieDonationInfo, PricingResult def find_rate_for_cookie(all_time: int, year: int, rates: dict[str, RateConfig]): best = None best_price = -1.0 for key, rate in rates.items(): donate = year if rate.type == "year" else all_time if rate.min <= donate <= rate.max and rate.price > best_price: best_price = rate.price best = (key, rate, donate) if best: return best return (None, None, 0) def calc_avg_price(donates: list[int], cfg: BotConfig) -> float: if not donates: return 0.0 avg = sum(donates) / len(donates) price = avg / 1000.0 price = max(cfg.avg_min_price, min(cfg.avg_max_price, price)) return round(price, 2) def price_cookie_batch( donates: list[CookieDonationInfo], cfg: BotConfig, ) -> tuple[list[PricingResult], bool, float]: priced: list[PricingResult] = [] unpriced: list[CookieDonationInfo] = [] for item in donates: key, rate, donate_used = find_rate_for_cookie(item.all_time, item.year, cfg.rates) if rate: priced.append( PricingResult( cookie=item.cookie, user_id=item.user_id, username=item.username, all_time=item.all_time, year=item.year, price=rate.price, rate_key=key, rate_name=rate.name, donate_used=donate_used, ) ) elif item.all_time > 0: unpriced.append(item) all_donate_infos = [item for item in donates if item.all_time > 0] total_donate_cookies = len(all_donate_infos) avg_used = False avg_price = 0.0 if total_donate_cookies >= cfg.avg_min_cookies: avg_price = calc_avg_price([item.all_time for item in all_donate_infos], cfg) avg_total = avg_price * total_donate_cookies piece_total = sum(item.price for item in priced) if avg_total > piece_total: avg_used = True payable: list[PricingResult] = [] if avg_used: for item in all_donate_infos: payable.append( PricingResult( cookie=item.cookie, user_id=item.user_id, username=item.username, all_time=item.all_time, year=item.year, price=avg_price, is_avg=True, ) ) else: payable.extend(priced) return payable, avg_used, avg_price