Загрузка данных


# main.py
import random
from store import Store
from supplier import Supplier
from courier import Courier
from utils import select_store, calculate_payment, format_hours

def main() -> None:
    # Создаём поставщиков для магазинов
    supplier1 = Supplier("ООО Поставщик 1", success_prob=0.9)
    supplier2 = Supplier("ООО Поставщик 2", success_prob=0.8)
    supplier3 = Supplier("ООО Поставщик 3", success_prob=0.85)

    # Три магазина с разной скоростью и графиками
    central = Store("Центральный", processing_time=0,
                    open_hour=9.0, close_hour=21.0,
                    supplier=supplier1)
    east    = Store("Восточный", processing_time=5,
                    open_hour=8.0, close_hour=22.0,
                    supplier=supplier2)
    north   = Store("Северный", processing_time=10,
                    open_hour=8.0, close_hour=20.0,
                    supplier=supplier3)

    stores = [central, east, north]

    couriers = [
        Courier("Иван", "пеший"),
        Courier("Петр", "вело"),
        Courier("Мария", "авто"),
        Courier("Анна", "вело"),
    ]

    print("=== Система доставки из магазина ===\n")

    try:
        time_str = input("Введите текущее время в формате ЧЧ:ММ (например 8:30): ")
        h, m = map(int, time_str.split(':'))
        current_hour = h + m / 60.0
    except (ValueError, TypeError):
        print("Неверный формат, используется 8:30 по умолчанию.")
        current_hour = 8.5

    print(f"Текущее время: {int(current_hour)}:{int((current_hour%1)*60):02d}")

    # Шаг 1: выбор магазина
    chosen_store = select_store(stores, current_hour)
    if chosen_store is None:
        print("Все магазины закрыты. Приходите позже.")
        return

    print(f"\nВыбран магазин: {chosen_store}.")
    remaining = chosen_store.time_until_close(current_hour)
    if remaining > 0:
        print(f"Магазин закроется через {format_hours(remaining)}.")

    # Шаг 2: проверка товара в магазине
    item = "item1"
    if not chosen_store.has_item(item):
        print(f"\nТовара '{item}' нет в наличии в магазине.")
        ans = input("Попытаться заказать у поставщика? (да/нет): ").strip().lower()
        if ans not in ('да', 'yes', 'y'):
            print("Заказ отменён. До свидания!")
            return

        print(f"Запрашиваем поставщика {chosen_store.supplier.name}...")
        success, delay = chosen_store.request_supplier(item)
        if not success:
            print("К сожалению, поставщик не смог выполнить заказ. Попробуйте позже.")
            return

        print(f"Поставщик доставит товар через {delay:.1f} ч.")
        # Ждать ли пользователю? Можно запросить или просто имитировать ожидание.
        wait_ans = input(f"Ожидать {delay:.1f} ч. до поступления товара? (да/нет): ").strip().lower()
        if wait_ans not in ('да', 'yes', 'y'):
            print("Заказ отменён.")
            return

        # Имитация ожидания (время продвигается)
        print(f"Ожидаем {format_hours(delay)}...")
        # Для симуляции изменим текущее время
        current_hour += delay
        print(f"Новое время: {int(current_hour)}:{int((current_hour%1)*60):02d}")
        # Проверяем, не закрылся ли магазин после ожидания
        if not chosen_store.is_open(current_hour):
            print("Магазин закрылся во время ожидания поставки. Заказ отменён.")
            return
        remaining = chosen_store.time_until_close(current_hour)
        print(f"Магазин закроется через {format_hours(remaining)}.")
    else:
        print("Товар в наличии.")

    # Шаг 3: тип доставки
    choice = input("\nВыберите тип доставки (обычная/экспресс): ").strip().lower()
    is_express = choice == "экспресс"
    print("Экспресс-доставка активирована." if is_express else "Обычная доставка.")

    # Шаг 4: курьер
    courier = random.choice(couriers)
    base_time = courier.estimate_delivery_time()
    total_estimation = base_time + chosen_store.processing_time
    print(f"\n{courier} взял ваш заказ.")
    print(f"Расчётное время доставки: {total_estimation} мин.")

    # Шаг 5: явка курьера
    if not courier.shows_up():
        print(f"\nКурьер не вышел на работу и оштрафован на {Courier.NO_SHOW_FINE:.0f} руб.")
        print("Простите за неудобства.")
        courier.receive_payment(-Courier.NO_SHOW_FINE)
        return

    # Шаг 6: оценка
    try:
        rating = int(input("\nПожалуйста, оцените доставку от 1 до 5: "))
        if not 1 <= rating <= 5:
            raise ValueError
    except (ValueError, TypeError):
        print("Некорректная оценка. Присвоена 3 по умолчанию.")
        rating = 3

    payment = calculate_payment(rating, is_express)
    courier.receive_payment(payment)

    coeff_map = {1: 1.0, 2: 1.2, 3: 1.4, 4: 1.6, 5: 1.8}
    coeff = coeff_map[rating]
    desc = f"200 * {coeff:.1f}"
    if is_express:
        desc += " * 1.5 (экспресс)"
    print(f"\n{courier.name} выполнил заказ на {rating} и получил {payment:.2f} рублей ({desc})")
    print(f"Общий заработок курьера: {courier.total_earned:.2f} руб.")


if __name__ == "__main__":
    main()