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', False, 'import requests\n'), (23, 'json.loads', 'json.loads', False, 'import json\n'), (44, 'requests.get', 'requests.get', False, 'import requests\n'), (46, 'json.loads', 'json.loads', False, 'import json\n'), (67, 'requests.put', 'requests.put', False, 'import requests\n'), (72, 'requests.put', 'requests.put', False, 'import requests\n'), (90, 'requests.get', 'requests.get', False, 'import requests\n'), (93, 'json.loads', 'json.loads', False, 'import json\n'), (94, 'requests.put', 'requests.put', False, 'import requests\n'), (110, 'requests.delete', 'requests.delete', False, 'import requests\n'), (125, 'requests.get', 'requests.get', False, 'import requests\n'), (136, 'requests.delete', 'requests.delete', False, 'import requests\n'), (69, 'requests.delete', 'requests.delete', False, 'import requests\n'), (111, 'json.loads', 'json.loads', False, 'import json\n'), (126, 'json.loads', 'json.loads', False, 'import json\n'), (137, 'json.loads', 'json.loads', False, 'import json\n'), (71, 'requests.put', 'requests.put', False, 'import requests\n')]