import requests
import json


HEADERS = {"Authorization": "OAuth AgAAAAA00Se2AAW1W1yCegavqkretMXBGkoUUQk", "Accept": "*/*"}
URL = "https://cloud-api.yandex.net:443/v1/disk/"


def get_folder_info(folder_name_1, folder_name_2, url=None, headers=None):
    """Получение информации о статусе папок на диске

    Args:
        folder_name_1: имя корневой папки.
        folder_name_2: имя вложенной папки.
        url: адрес для запроса.
        headers: заголовки запроса, содержащие токен авторизации.

    Returns:
        Информация о папках: путь до папок, если созданы успешно. В противном случае описание ошибки.
    """

    info = requests.get(url= URL + "resources?path=" + folder_name_1 + "/" + folder_name_2 + "&fields=path", headers=HEADERS)
    dict_response = json.loads(info.content)
    if info.status_code == 404:
        return dict_response["description"]
    else:
        return dict_response["path"]


def get_file_info(folder_name_1, folder_name_2, file_name, url=None, headers=None):
    """Получение информации о файле

    Args:
        folder_name_1: имя корневой папки.
        folder_name_2: имя вложенной папки.
        file_name: имя файла.
        url: адрес для запроса.
        headers: заголовки запроса, содержащие токен авторизации.

    Returns:
        Путь до файла.
    """

    file_info_json = requests.get(url= URL + "resources?path=" + folder_name_1 + "/" + folder_name_2 + "/" + file_name +
                                  ".jpg&fields=path", headers = HEADERS)
    file_info_dict = json.loads(file_info_json.content)
    if file_info_json.status_code == 404:
        return file_info_dict["description"]
    else:
        return file_info_dict["path"]


def create_folder(folder_name_1, folder_name_2, url=None, headers=None):
    """Создание папок на диске.

    Args:
        folder_name_1: имя корневой папки.
        folder_name_2: имя вложенной папки.
        url: адрес для запроса.
        headers: заголовки запроса, содержащие токен авторизации.

    Returns:
        Информация о папках через вызов другой функции.
    """

    response_code = [202, 204]
    new_folder = requests.put(url= URL + "resources?path=" + folder_name_1, headers=HEADERS)
    if new_folder.status_code == 409:
        new_folder = requests.delete(url= URL + "resources?path=" + folder_name_1 + "&permanently=true", headers=HEADERS)
        if new_folder.status_code in response_code:
            requests.put(url= URL + "resources?path=" + folder_name_1, headers=HEADERS)
    requests.put(url= URL + "resources?path=" + folder_name_1 + "/" + folder_name_2, headers=HEADERS)
    return get_folder_info(folder_name_1, folder_name_2)


def create_file(folder_name_1, folder_name_2, file_name, url=None, headers=None):
    """Загрузка файла на диск.

    Args:
        folder_name_1: имя корневой папки.
        folder_name_2: имя вложенной папки.
        file_name: имя файла.
        url: адрес для запроса.
        headers: заголовки запроса, содержащие токен авторизации.

    Returns:
        Информацию о созданном файле через вызов другой функции.
    """
    assert len(file_name) > 0, "Не введено имя файла"
    new_file = requests.get(url= URL + "resources/upload?path=" + folder_name_1 + "/" + folder_name_2 + "/" + file_name +
                            ".jpg&overwrite=true", headers=HEADERS)
    get_link = new_file.content
    link = json.loads(get_link)
    requests.put(url=link["href"])
    return get_file_info(folder_name_1, folder_name_2, file_name)


def move_to_bucket(folder_name, url=None, headers=None):
    """Перемещение папки с содержимым в корзину.

    Args:
        folder_name: имя корневой папки.
        url: адрес для запроса.
        headers: заголовки запроса, содержащие токен авторизации.

    Returns:
        Ссылку для проверки статуса.
    """

    order_response = requests.delete(url= URL + "resources?path=" + folder_name, headers=HEADERS)
    return json.loads(order_response.content)["href"]


def get_status(link, headers=None):
    """Получение статуса операции по ссылке.

    Args:
        link: ссылка, для которой проверяется статус.
        headers: заголовки запроса, содержащие токен авторизации.

    Returns:
        Статус операции.
    """

    status_response = requests.get(url=link, headers=HEADERS)
    return json.loads(status_response.content)["status"]


def clean_bucket():
    """Очистка корзины.

    Returns:
        Ссылку для проверки статуса.
    """

    remove_folder = requests.delete(url= URL + "trash/resources", headers=HEADERS)
    return json.loads(remove_folder.content)["href"]

[(22, 'requests.get', 'requests.get', ([], {'url': "(URL + 'resources?path=' + folder_name_1 + '/' + folder_name_2 + '&fields=path'\n    )", 'headers': 'HEADERS'}), False, 'import requests\n'), (23, 'json.loads', 'json.loads', (['info.content'], {}), False, 'import json\n'), (44, 'requests.get', 'requests.get', ([], {'url': "(URL + 'resources?path=' + folder_name_1 + '/' + folder_name_2 + '/' +\n    file_name + '.jpg&fields=path')", 'headers': 'HEADERS'}), False, 'import requests\n'), (46, 'json.loads', 'json.loads', (['file_info_json.content'], {}), False, 'import json\n'), (67, 'requests.put', 'requests.put', ([], {'url': "(URL + 'resources?path=' + folder_name_1)", 'headers': 'HEADERS'}), False, 'import requests\n'), (72, 'requests.put', 'requests.put', ([], {'url': "(URL + 'resources?path=' + folder_name_1 + '/' + folder_name_2)", 'headers': 'HEADERS'}), False, 'import requests\n'), (90, 'requests.get', 'requests.get', ([], {'url': "(URL + 'resources/upload?path=' + folder_name_1 + '/' + folder_name_2 + '/' +\n    file_name + '.jpg&overwrite=true')", 'headers': 'HEADERS'}), False, 'import requests\n'), (93, 'json.loads', 'json.loads', (['get_link'], {}), False, 'import json\n'), (94, 'requests.put', 'requests.put', ([], {'url': "link['href']"}), False, 'import requests\n'), (110, 'requests.delete', 'requests.delete', ([], {'url': "(URL + 'resources?path=' + folder_name)", 'headers': 'HEADERS'}), False, 'import requests\n'), (125, 'requests.get', 'requests.get', ([], {'url': 'link', 'headers': 'HEADERS'}), False, 'import requests\n'), (136, 'requests.delete', 'requests.delete', ([], {'url': "(URL + 'trash/resources')", 'headers': 'HEADERS'}), False, 'import requests\n'), (69, 'requests.delete', 'requests.delete', ([], {'url': "(URL + 'resources?path=' + folder_name_1 + '&permanently=true')", 'headers': 'HEADERS'}), False, 'import requests\n'), (111, 'json.loads', 'json.loads', (['order_response.content'], {}), False, 'import json\n'), (126, 'json.loads', 'json.loads', (['status_response.content'], {}), False, 'import json\n'), (137, 'json.loads', 'json.loads', (['remove_folder.content'], {}), False, 'import json\n'), (71, 'requests.put', 'requests.put', ([], {'url': "(URL + 'resources?path=' + folder_name_1)", 'headers': 'HEADERS'}), False, 'import requests\n')]