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


class User:
    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_messages(self, messages: list):
        return {
            "uuid": self.uuid_,
            "name": self.name,
            "surname": self.surname,
            "messages": messages
        }


app = Flask(__name__)

users: list[User] = [
    User(name='Dr.', surname='Kino', uuid_='94b171ea-39f6-4a67-9c67-061743f67cfd'),
    User(name='Caspian', surname='Holstrom', uuid_='724a3192-70dd-4909-9b0f-c9060a4ab1bd'),
    User(name='Admin', surname='Admin', uuid_='46672ea5-3d7b-4137-a0ac-efd898ca4db6')
]

messages_url = 'http://messageService:20002/'


def list_jsonify():
    return jsonify([user.to_dict() for user in users])

@app.route('/', methods=['GET'])
def get_all():
    return list_jsonify(), 200

@app.route('/<uuid:uuid_>', methods=['GET'])
def get_one(uuid_):
    for user in users:
        if user.uuid_ == uuid_:
            return user.to_dict(), 200

    return f'Пользователь с uuid {uuid_} не найден', 404

@app.route('/info/<uuid:uuid_>', methods=['GET'])
def get_one_with_messages(uuid_):
    for user in users:
        if user.uuid_ == uuid_:
            response = requests.get(messages_url + f'by-user/{uuid_}')
            print(response.json())
            return user.to_dict_with_messages(response.json()), 200

    return f'Пользователь с uuid {uuid_} не найден', 404

@app.route('/check/<uuid:uuid_>', methods=['GET'])
def check_exist(uuid_):
    for user in users:
        if user.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_user = User(name, surname, None)
    users.append(new_user)
    return get_one(new_user.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 user in users:
        if user.uuid_ == uuid_:
            if new_name is not None:
                user.name = new_name
            if new_surname is not None:
                user.surname = new_surname
            return get_one(user.uuid_)

    return f'Пользователь с uuid {uuid_} не найден', 404


@app.route('/<uuid:uuid_>', methods=['DELETE'])
def delete(uuid_):
    for user in users:
        if user.uuid_ == uuid_:
            users.remove(user)
            return 'Пользователь удален', 200

    return f'Пользователь с uuid {uuid_} не найден', 404


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