import random
from datetime import datetime, timedelta
from faker import Faker

fake = Faker('ru_RU')
Faker.seed(0)
random.seed(0)

# Словарь отделов и соответствующих товаров (однословные названия)
DEPARTMENT_PRODUCTS = {
    "Бытовая техника": ["холодильник", "плита", "микроволновка", "утюг", "чайник"],
    "Электроника": ["телефон", "ноутбук", "телевизор", "наушники", "планшет"],
    "Мебель": ["диван", "кровать", "шкаф", "стол", "стул"],
    "Одежда": ["футболка", "джинсы", "куртка", "платье", "рубашка"],
    "Продукты": ["молоко", "хлеб", "сыр", "колбаса", "яйца"],
    "Хозтовары": ["ведро", "швабра", "мыло", "перчатки", "губка"],
    "Спорт": ["мяч", "гантели", "велосипед", "ракетка", "коврик"],
    "Книги": ["роман", "учебник", "журнал", "словарь", "атлас"],
    "Красота": ["шампунь", "крем", "помада", "духи", "лосьон"],
    "Автотовары": ["шины", "аккумулятор", "масло", "фильтр", "антифриз"]
}

def random_fio():
    last_names = ["Иванов", "Петров", "Сидоров", "Смирнов", "Кузнецов"]
    first_names = ["Александр", "Дмитрий", "Сергей", "Андрей", "Михаил"]
    middle_names = ["Иванович", "Петрович", "Сергеевич", "Андреевич", "Михайлович"]
    return f"{random.choice(last_names)} {random.choice(first_names)} {random.choice(middle_names)}"

def random_phone():
    return f"+7{random.randint(900, 999)}{random.randint(1000000, 9999999)}"

def random_date(start_year=2020, end_year=2023):
    start = datetime(start_year, 1, 1)
    end = datetime(end_year, 12, 31)
    return start + timedelta(seconds=random.randint(0, int((end - start).total_seconds())))

def generate_sql_file(filename, count_multiplier=10):
    with open(filename, 'w', encoding='utf-8') as f:
        f.write("-- Очистка таблиц перед заполнением\n")
        f.write("TRUNCATE Отдел, Товар, Продажа RESTART IDENTITY CASCADE;\n\n")

        # Таблица Отдел
        f.write("-- Заполнение таблицы Отдел\n")
        departments = []
        for i in range(1, 10 * count_multiplier + 1):
            dept_type = random.choice(list(DEPARTMENT_PRODUCTS.keys()))
            имя_отдела = f"{dept_type}-{i}"
            departments.append(имя_отдела)
            фио = random_fio().replace("'", "''")
            телефон = random_phone()
            объем = round(random.uniform(10000, 100000), 2)
            f.write(
                f"INSERT INTO Отдел (Имя_отдела, ФИО_заведующего, Телефон, Объём_реализации_в_день) "
                f"VALUES ('{имя_отдела}', '{фио}', '{телефон}', {объем});\n"
            )

        # Таблица Товар
        f.write("\n-- Заполнение таблицы Товар\n")
        единицы = ["шт", "кг", "л", "упак", "м"]
        used_artikuls = set()
        product_info = {}  # Для хранения соответствия товаров и отделов
        
        for i in range(1, 50 * count_multiplier + 1):
            while True:
                артикул = random.randint(10000, 99999)
                if артикул not in used_artikuls:
                    used_artikuls.add(артикул)
                    break
            
            # Выбираем отдел и соответствующий товар
            dept = random.choice(departments)
            dept_type = dept.split('-')[0]
            имя_товара = random.choice(DEPARTMENT_PRODUCTS[dept_type])
            
            единица = random.choice(единицы)
            цена = round(random.uniform(100, 10000), 2)
            
            product_info[артикул] = dept  # Сохраняем соответствие товара и отдела
            
            f.write(
                f"INSERT INTO Товар (Артикул_товара, Имя_товара, Единица_измерения, Розничная_цена) "
                f"VALUES ({артикул}, '{имя_товара}', '{единица}', {цена});\n"
            )

        # Таблица Продажа
        f.write("\n-- Заполнение таблицы Продажа\n")
        artikuls_list = list(used_artikuls)
        for i in range(1, 200 * count_multiplier + 1):
            дата = random_date().strftime('%Y-%m-%d')
            количество = random.randint(1, 100)
            
            # Выбираем артикул и соответствующий ему отдел
            артикул_товара = random.choice(artikuls_list)
            dept_for_product = product_info[артикул_товара]
            
            # Находим ID отдела по имени
            код_отдела = departments.index(dept_for_product) + 1
            
            f.write(
                f"INSERT INTO Продажа (Дата_продажи, Количество, Код_отдела, Артикул_товара) "
                f"VALUES ('{дата}', {количество}, {код_отдела}, {артикул_товара});\n"
            )

    print(f"SQL-файл '{filename}' успешно сгенерирован.")
    print(f"Количество записей:")
    print(f"- Отделы: {10 * count_multiplier}")
    print(f"- Товары: {50 * count_multiplier}")
    print(f"- Продажи: {200 * count_multiplier}")

if __name__ == "__main__":
    generate_sql_file("simple_products_data.sql", count_multiplier=10)
