import requests
from typing import Optional

# Конфигурация
USERNAME = "admin"
PASSWORD = "GzwQMe3j2DsPRKpL2DVw6A"
BASE_URL = "http://localhost:8000"


class LibraryAPI:
    def __init__(self, base_url: str):
        self.base_url = base_url
        self.token: Optional[str] = None
        self.session = requests.Session()

    def login(self, username: str, password: str) -> bool:
        """Авторизация и получение токена"""
        response = self.session.post(
            f"{self.base_url}/api/auth/token",
            data={"username": username, "password": password},
            headers={"Content-Type": "application/x-www-form-urlencoded"}
        )
        if response.status_code == 200:
            self.token = response.json()["access_token"]
            self.session.headers.update({"Authorization": f"Bearer {self.token}"})
            print(f"✓ Авторизация успешна для пользователя: {username}")
            return True
        else:
            print(f"✗ Ошибка авторизации: {response.text}")
            return False

    def register(self, username: str, email: str, password: str, full_name: str = None) -> bool:
        """Регистрация нового пользователя"""
        data = {
            "username": username,
            "email": email,
            "password": password
        }
        if full_name:
            data["full_name"] = full_name

        response = self.session.post(
            f"{self.base_url}/api/auth/register",
            json=data
        )
        if response.status_code == 201:
            print(f"✓ Пользователь {username} зарегистрирован")
            return True
        else:
            print(f"✗ Ошибка регистрации: {response.text}")
            return False

    def create_author(self, name: str) -> Optional[int]:
        """Создание автора"""
        response = self.session.post(
            f"{self.base_url}/api/authors/",
            json={"name": name}
        )
        if response.status_code == 200:
            author_id = response.json()["id"]
            print(f"  ✓ Автор создан: {name} (ID: {author_id})")
            return author_id
        else:
            print(f"  ✗ Ошибка создания автора {name}: {response.text}")
            return None

    def create_book(self, title: str, description: str) -> Optional[int]:
        """Создание книги"""
        response = self.session.post(
            f"{self.base_url}/api/books/",
            json={"title": title, "description": description}
        )
        if response.status_code == 200:
            book_id = response.json()["id"]
            print(f"  ✓ Книга создана: {title} (ID: {book_id})")
            return book_id
        else:
            print(f"  ✗ Ошибка создания книги {title}: {response.text}")
            return None

    def create_genre(self, name: str) -> Optional[int]:
        """Создание жанра"""
        response = self.session.post(
            f"{self.base_url}/api/genres/",
            json={"name": name}
        )
        if response.status_code == 200:
            genre_id = response.json()["id"]
            print(f"  ✓ Жанр создан: {name} (ID: {genre_id})")
            return genre_id
        else:
            print(f"  ✗ Ошибка создания жанра {name}: {response.text}")
            return None

    def link_author_book(self, author_id: int, book_id: int) -> bool:
        """Связь автора и книги"""
        response = self.session.post(
            f"{self.base_url}/api/relationships/author-book",
            params={"author_id": author_id, "book_id": book_id}
        )
        if response.status_code == 200:
            print(f"    ↔ Связь автор-книга: {author_id} ↔ {book_id}")
            return True
        else:
            print(f"    ✗ Ошибка связи автор-книга: {response.text}")
            return False

    def link_genre_book(self, genre_id: int, book_id: int) -> bool:
        """Связь жанра и книги"""
        response = self.session.post(
            f"{self.base_url}/api/relationships/genre-book",
            params={"genre_id": genre_id, "book_id": book_id}
        )
        if response.status_code == 200:
            print(f"    ↔ Связь жанр-книга: {genre_id} ↔ {book_id}")
            return True
        else:
            print(f"    ✗ Ошибка связи жанр-книга: {response.text}")
            return False


def main():
    api = LibraryAPI(BASE_URL)

    # Авторизация
    if not api.login(USERNAME, PASSWORD):
        print("Не удалось авторизоваться. Проверьте логин и пароль.")
        return

    print("\n📚 Создание авторов...")
    authors_data = [
        "Лев Толстой",
        "Фёдор Достоевский",
        "Антон Чехов",
        "Александр Пушкин",
        "Михаил Булгаков",
        "Николай Гоголь",
        "Иван Тургенев",
        "Борис Пастернак",
        "Михаил Лермонтов",
        "Александр Солженицын",
        "Максим Горький",
        "Иван Бунин"
    ]

    authors = {}
    for name in authors_data:
        author_id = api.create_author(name)
        if author_id:
            authors[name] = author_id

    print("\n🏷️ Создание жанров...")
    genres_data = [
        "Роман",
        "Повесть",
        "Рассказ",
        "Поэзия",
        "Драма",
        "Философская проза",
        "Историческая проза",
        "Сатира"
    ]

    genres = {}
    for name in genres_data:
        genre_id = api.create_genre(name)
        if genre_id:
            genres[name] = genre_id

    print("\n📖 Создание книг...")
    books_data = [
        {
            "title": "Война и мир",
            "description": "Роман-эпопея Льва Толстого, описывающий русское общество в эпоху войн против Наполеона в 1805—1812 годах. Одно из величайших произведений мировой литературы.",
            "authors": ["Лев Толстой"],
            "genres": ["Роман", "Историческая проза"]
        },
        {
            "title": "Анна Каренина",
            "description": "Роман Льва Толстого о трагической любви замужней дамы Анны Карениной к блестящему офицеру Вронскому. История страсти, ревности и роковых решений.",
            "authors": ["Лев Толстой"],
            "genres": ["Роман", "Драма"]
        },
        {
            "title": "Преступление и наказание",
            "description": "Социально-психологический роман Фёдора Достоевского о бедном студенте Раскольникове, совершившем убийство и мучающемся угрызениями совести.",
            "authors": ["Фёдор Достоевский"],
            "genres": ["Роман", "Философская проза"]
        },
        {
            "title": "Братья Карамазовы",
            "description": "Последний роман Достоевского, история семьи Карамазовых, затрагивающая глубокие вопросы веры, свободы воли и морали.",
            "authors": ["Фёдор Достоевский"],
            "genres": ["Роман", "Философская проза", "Драма"]
        },
        {
            "title": "Идиот",
            "description": "Роман о князе Мышкине — человеке с чистой душой, который сталкивается с жестокостью и корыстью петербургского общества.",
            "authors": ["Фёдор Достоевский"],
            "genres": ["Роман", "Философская проза"]
        },
        {
            "title": "Вишнёвый сад",
            "description": "Пьеса Антона Чехова о разорении дворянского гнезда и продаже родового имения с вишнёвым садом.",
            "authors": ["Антон Чехов"],
            "genres": ["Драма"]
        },
        {
            "title": "Чайка",
            "description": "Пьеса Чехова о любви, искусстве и несбывшихся мечтах, разворачивающаяся в усадьбе на берегу озера.",
            "authors": ["Антон Чехов"],
            "genres": ["Драма"]
        },
        {
            "title": "Палата № 6",
            "description": "Повесть о враче психиатрической больницы, который начинает сомневаться в границах между нормой и безумием.",
            "authors": ["Антон Чехов"],
            "genres": ["Повесть", "Философская проза"]
        },
        {
            "title": "Евгений Онегин",
            "description": "Роман в стихах Александра Пушкина — энциклопедия русской жизни начала XIX века и история несчастной любви.",
            "authors": ["Александр Пушкин"],
            "genres": ["Роман", "Поэзия"]
        },
        {
            "title": "Капитанская дочка",
            "description": "Исторический роман Пушкина о событиях Пугачёвского восстания, любви и чести.",
            "authors": ["Александр Пушкин"],
            "genres": ["Роман", "Историческая проза"]
        },
        {
            "title": "Пиковая дама",
            "description": "Повесть о молодом офицере Германне, одержимом желанием узнать тайну трёх карт.",
            "authors": ["Александр Пушкин"],
            "genres": ["Повесть"]
        },
        {
            "title": "Мастер и Маргарита",
            "description": "Роман Михаила Булгакова о визите дьявола в Москву 1930-х годов, переплетённый с историей Понтия Пилата.",
            "authors": ["Михаил Булгаков"],
            "genres": ["Роман", "Сатира", "Философская проза"]
        },
        {
            "title": "Собачье сердце",
            "description": "Повесть-сатира о профессоре Преображенском, превратившем бродячего пса в человека.",
            "authors": ["Михаил Булгаков"],
            "genres": ["Повесть", "Сатира"]
        },
        {
            "title": "Белая гвардия",
            "description": "Роман о семье Турбиных в Киеве во время Гражданской войны 1918-1919 годов.",
            "authors": ["Михаил Булгаков"],
            "genres": ["Роман", "Историческая проза"]
        },
        {
            "title": "Мёртвые души",
            "description": "Поэма Николая Гоголя о похождениях Чичикова, скупающего «мёртвые души» крепостных крестьян.",
            "authors": ["Николай Гоголь"],
            "genres": ["Роман", "Сатира"]
        },
        {
            "title": "Ревизор",
            "description": "Комедия о чиновниках уездного города, принявших проезжего за ревизора из Петербурга.",
            "authors": ["Николай Гоголь"],
            "genres": ["Драма", "Сатира"]
        },
        {
            "title": "Шинель",
            "description": "Повесть о маленьком человеке — титулярном советнике Акакии Башмачкине и его мечте о новой шинели.",
            "authors": ["Николай Гоголь"],
            "genres": ["Повесть"]
        },
        {
            "title": "Отцы и дети",
            "description": "Роман Ивана Тургенева о конфликте поколений и нигилизме на примере Евгения Базарова.",
            "authors": ["Иван Тургенев"],
            "genres": ["Роман", "Философская проза"]
        },
        {
            "title": "Записки охотника",
            "description": "Цикл рассказов Тургенева о русской деревне и крестьянах, написанный с глубоким сочувствием к народу.",
            "authors": ["Иван Тургенев"],
            "genres": ["Рассказ"]
        },
        {
            "title": "Доктор Живаго",
            "description": "Роман Бориса Пастернака о судьбе русского интеллигента в эпоху революции и Гражданской войны.",
            "authors": ["Борис Пастернак"],
            "genres": ["Роман", "Историческая проза", "Поэзия"]
        },
        {
            "title": "Герой нашего времени",
            "description": "Роман Михаила Лермонтова о Печорине — «лишнем человеке», скучающем и разочарованном в жизни.",
            "authors": ["Михаил Лермонтов"],
            "genres": ["Роман", "Философская проза"]
        },
        {
            "title": "Архипелаг ГУЛАГ",
            "description": "Документально-художественное исследование Александра Солженицына о системе советских лагерей.",
            "authors": ["Александр Солженицын"],
            "genres": ["Историческая проза"]
        },
        {
            "title": "Один день Ивана Денисовича",
            "description": "Повесть о одном дне заключённого советского лагеря, положившая начало лагерной прозе.",
            "authors": ["Александр Солженицын"],
            "genres": ["Повесть", "Историческая проза"]
        },
        {
            "title": "На дне",
            "description": "Пьеса Максима Горького о жителях ночлежки для бездомных — людях, оказавшихся на дне жизни.",
            "authors": ["Максим Горький"],
            "genres": ["Драма", "Философская проза"]
        },
        {
            "title": "Тёмные аллеи",
            "description": "Сборник рассказов Ивана Бунина о любви — трагической, мимолётной и прекрасной.",
            "authors": ["Иван Бунин"],
            "genres": ["Рассказ"]
        }
    ]

    books = {}
    for book in books_data:
        book_id = api.create_book(book["title"], book["description"])
        if book_id:
            books[book["title"]] = {
                "id": book_id,
                "authors": book["authors"],
                "genres": book["genres"]
            }

    print("\n🔗 Создание связей...")

    for book_title, book_info in books.items():
        book_id = book_info["id"]

        for author_name in book_info["authors"]:
            if author_name in authors:
                api.link_author_book(authors[author_name], book_id)

        for genre_name in book_info["genres"]:
            if genre_name in genres:
                api.link_genre_book(genres[genre_name], book_id)

    print("\n" + "=" * 50)
    print("📊 ИТОГИ:")
    print(f"  • Авторов создано: {len(authors)}")
    print(f"  • Жанров создано: {len(genres)}")
    print(f"  • Книг создано: {len(books)}")
    print("=" * 50)


if __name__ == "__main__":
    main()
