from flask import Flask, jsonify, request
from uuid import uuid4
import uuid
import requests


class Author:
    def __init__(self, name, surname, uuid_: uuid):
        if uuid_ is None:
            self.uuid_: uuid = uuid4()
        else:
            self.uuid_: uuid = uuid.UUID(uuid_)
        self.name: str = name
        self.surname: str = surname

    def to_dict(self):
        return {
            "uuid": self.uuid_,
            "name": self.name,
            "surname": self.surname
        }

    def to_dict_with_books(self, books: list):
        return {
            "uuid": self.uuid_,
            "name": self.name,
            "surname": self.surname,
            "books": books
        }


app = Flask(__name__)

authors: list[Author] = [
    Author(name='Leon', surname='Kane', uuid_='997aa4c5-ebb2-4794-ba81-e742f9f1fa30'),
    Author(name='James', surname='Rasal', uuid_='694827e4-0f93-45a5-8f75-bad7ef2d21fe'),
    Author(name='Tess', surname='Root', uuid_='eb815350-c7b9-4446-8434-4c0640c21995')
]

books_url = 'http://book_service:20002/'


def list_jsonify():
    return jsonify([author.to_dict() for author in authors])


# получение списка всех авторов
@app.route('/', methods=['GET'])
def get_all():
    return list_jsonify(), 200


# получение автора по идентификатору
@app.route('/<uuid:uuid_>', methods=['GET'])
def get_one(uuid_):
    for author in authors:
        if author.uuid_ == uuid_:
            return author.to_dict(), 200

    return 'Автор с таким uuid не был найден', 404


# получение автора со списком его книг
@app.route('/with-books/<uuid:uuid_>', methods=['GET'])
def get_one_with_books(uuid_):
    for author in authors:
        if author.uuid_ == uuid_:
            response = requests.get(books_url + f'by-author/{uuid_}')
            print(response.json())
            return author.to_dict_with_books(response.json()), 200

    return 'Автор с таким uuid не был найден', 404


# проверка наличия автора по его идентификатору (для book_service)
@app.route('/check/<uuid:uuid_>', methods=['GET'])
def check_exist(uuid_):
    for author in authors:
        if author.uuid_ == uuid_:
            return '', 200
    return '', 404


# создание автора
@app.route('/', methods=['POST'])
def create():
    data = request.json
    name = data.get('name', None)
    surname = data.get('surname', None)
    if name is None or surname is None:
        return 'Недостаточно полей для создания нового автора', 404

    new_author = Author(name, surname, None)
    authors.append(new_author)
    return get_one(new_author.uuid_)


# изменение автора по идентификатору
@app.route('/<uuid:uuid_>', methods=['PUT'])
def update_by_id(uuid_):
    data = request.json
    new_name = data.get('name', None)
    new_surname = data.get('surname', None)

    for author in authors:
        if author.uuid_ == uuid_:
            if new_name is not None:
                author.name = new_name
            if new_surname is not None:
                author.surname = new_surname
            return get_one(author.uuid_)

    return 'Автор с таким uuid не был найден', 404


# удаление автора по идентификатору
@app.route('/<uuid:uuid_>', methods=['DELETE'])
def delete(uuid_):
    for author in authors:
        if author.uuid_ == uuid_:
            authors.remove(author)
            return 'Автор успешно удален', 200

    return 'Автор с таким uuid не был найден', 404


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=20001, debug=True)
