import random
from datetime import datetime, timedelta
from faker import Faker

fake = Faker('ru_RU')

# Списки для генерации ФИО (с ограничением длины)
last_names = ['Иванов', 'Петров', 'Сидоров', 'Смирнов', 'Кузнецов', 'Попов', 'Васильев', 'Павлов', 'Семёнов', 'Голубев']
first_names = ['Александр', 'Дмитрий', 'Сергей', 'Андрей', 'Алексей', 'Михаил', 'Евгений', 'Владимир', 'Иван', 'Николай']
middle_names = ['Александрович', 'Дмитриевич', 'Сергеевич', 'Андреевич', 'Алексеевич', 'Михайлович', 'Евгеньевич', 'Владимирович', 'Иванович', 'Николаевич']

def generate_fio(max_length=30):
    """Генерация ФИО с ограничением максимальной длины"""
    while True:
        fio = f"{random.choice(last_names)} {random.choice(first_names)} {random.choice(middle_names)}"
        if len(fio) <= max_length:
            return fio

def truncate_string(value, max_length):
    """Обрезает строку до указанной длины"""
    return value[:max_length] if value and len(value) > max_length else value

# Генерация SQL файла
with open('database_setup.sql', 'w', encoding='utf-8') as f:
    # Создание таблиц с увеличенными размерами для проблемных полей
    f.write("""-- Создание таблиц
CREATE TABLE IF NOT EXISTS Издание (
    Индекс_издания INT PRIMARY KEY,
    Вид_издания VARCHAR(50) NOT NULL,
    Название_издания VARCHAR(50) NOT NULL,
    Стоимость_1мес INT NOT NULL
);

CREATE TABLE IF NOT EXISTS Получатель (
    Код_получателя INT PRIMARY KEY,
    ФИО_получателя VARCHAR(50) NOT NULL,  -- Увеличено с 30 до 50
    Улица VARCHAR(50) NOT NULL,
    Дом INT NOT NULL,
    Квартира INT NOT NULL
);

CREATE TABLE IF NOT EXISTS Подписка (
    Код_подписки SERIAL PRIMARY KEY,
    Код_получателя INT REFERENCES Получатель(Код_получателя),
    Индекс_издания INT REFERENCES Издание(Индекс_издания),
    Срок_подписки DATE NOT NULL,
    Месяц_начала DATE NOT NULL,
    Год_начала DATE NOT NULL
);

-- Заполнение таблиц тестовыми данными
""")

    # Виды изданий (с ограничением длины)
    виды_изданий = [
        'Газета', 'Журнал', 'Научный журнал', 
        'Детский журнал', 'Технический журнал', 
        'Медицинский журнал', 'Экономический журнал',
        'Литературный журнал', 'Спортивный журнал',
        'Модный журнал'
    ]
    
    # Генерация изданий (20-30 записей)
    f.write("\n-- Издания\n")
    названия_газет = [
        'Правда', 'Известия', 'Коммерсант', 'Ведомости', 
        'Московский комсомолец', 'Аргументы и факты',
        'Спорт-экспресс', 'Труд', 'Российская газета'
    ]
    названия_журналов = [
        'Наука и техника', 'Автомир', 'Здоровье', 'Космополитен',
        'Мир ПК', 'Домашний очаг', 'National Geographic',
        'Forbes', 'GQ', 'Vogue', 'Maxim', 'Популярная механика'
    ]
    
    for i in range(1, 21):
        if i <= 9:
            вид = truncate_string('Газета', 50)
            название = truncate_string(random.choice(названия_газет), 50)
        else:
            вид = truncate_string(random.choice(виды_изданий[1:]), 50)
            название = truncate_string(random.choice(названия_журналов), 50)
        
        стоимость = random.randint(100, 2000)
        f.write(f"INSERT INTO Издание VALUES ({i}, '{вид}', '{название}', {стоимость});\n")
    
    # Генерация получателей (200-300 записей)
    f.write("\n-- Получатели\n")
    for i in range(1, 251):
        фио = generate_fio(50)  # Ограничение 50 символов
        улица = truncate_string(fake.street_name(), 50)
        дом = random.randint(1, 99)
        квартира = random.randint(1, 99)
        f.write(f"INSERT INTO Получатель VALUES ({i}, '{фио}', '{улица}', {дом}, {квартира});\n")
    
    # Генерация подписок (200-300 записей)
    f.write("\n-- Подписки\n")
    for i in range(1, 251):
        код_получателя = random.randint(1, 250)
        индекс_издания = random.randint(1, 20)
        
        # Генерация дат
        год_начала = random.randint(2020, 2023)
        месяц_начала = random.randint(1, 12)
        день_начала = random.randint(1, 28)
        
        дата_начала = datetime(год_начала, месяц_начала, день_начала)
        срок_подписки = дата_начала + timedelta(days=random.randint(30, 365))
        
        f.write(f"INSERT INTO Подписка (Код_получателя, Индекс_издания, Срок_подписки, Месяц_начала, Год_начала) VALUES (")
        f.write(f"{код_получателя}, {индекс_издания}, ")
        f.write(f"'{срок_подписки.date()}', ")
        f.write(f"'{дата_начала.replace(day=1).date()}', ")
        f.write(f"'{дата_начала.replace(month=1, day=1).date()}');\n")

print("SQL файл 'database_setup.sql' успешно создан")
