from __future__ import annotations

from typing import List

from todoist_api_python.api import TodoistAPI
from todoist_api_python.models import (
    Collaborator,
    Comment,
    Label,
    Project,
    QuickAddResult,
    Section,
    Task,
)
from todoist_api_python.utils import run_async


class TodoistAPIAsync:
    def __init__(self, token: str) -> None:
        self._api = TodoistAPI(token)

    async def get_task(self, task_id: str) -> Task:
        return await run_async(lambda: self._api.get_task(task_id))

    async def get_tasks(self, **kwargs) -> List[Task]:
        return await run_async(lambda: self._api.get_tasks(**kwargs))

    async def add_task(self, content: str, **kwargs) -> Task:
        return await run_async(lambda: self._api.add_task(content, **kwargs))

    async def update_task(self, task_id: str, **kwargs) -> bool:
        return await run_async(lambda: self._api.update_task(task_id, **kwargs))

    async def close_task(self, task_id: str, **kwargs) -> bool:
        return await run_async(lambda: self._api.close_task(task_id, **kwargs))

    async def reopen_task(self, task_id: str, **kwargs) -> bool:
        return await run_async(lambda: self._api.reopen_task(task_id, **kwargs))

    async def delete_task(self, task_id: str, **kwargs) -> bool:
        return await run_async(lambda: self._api.delete_task(task_id, **kwargs))

    async def quick_add_task(self, text: str) -> QuickAddResult:
        return await run_async(lambda: self._api.quick_add_task(text))

    async def get_project(self, project_id: str) -> Project:
        return await run_async(lambda: self._api.get_project(project_id))

    async def get_projects(self) -> List[Project]:
        return await run_async(lambda: self._api.get_projects())

    async def add_project(self, name: str, **kwargs) -> Project:
        return await run_async(lambda: self._api.add_project(name, **kwargs))

    async def update_project(self, project_id: str, **kwargs) -> bool:
        return await run_async(lambda: self._api.update_project(project_id, **kwargs))

    async def delete_project(self, project_id: str, **kwargs) -> bool:
        return await run_async(lambda: self._api.delete_project(project_id, **kwargs))

    async def get_collaborators(self, project_id: str) -> List[Collaborator]:
        return await run_async(lambda: self._api.get_collaborators(project_id))

    async def get_section(self, section_id: str) -> Section:
        return await run_async(lambda: self._api.get_section(section_id))

    async def get_sections(self, **kwargs) -> List[Section]:
        return await run_async(lambda: self._api.get_sections(**kwargs))

    async def add_section(self, name: str, project_id: str, **kwargs) -> Section:
        return await run_async(
            lambda: self._api.add_section(name, project_id, **kwargs)
        )

    async def update_section(self, section_id: str, name: str, **kwargs) -> bool:
        return await run_async(
            lambda: self._api.update_section(section_id, name, **kwargs)
        )

    async def delete_section(self, section_id: str, **kwargs) -> bool:
        return await run_async(lambda: self._api.delete_section(section_id, **kwargs))

    async def get_comment(self, comment_id: str) -> Comment:
        return await run_async(lambda: self._api.get_comment(comment_id))

    async def get_comments(self, **kwargs) -> List[Comment]:
        return await run_async(lambda: self._api.get_comments(**kwargs))

    async def add_comment(self, content: str, **kwargs) -> Comment:
        return await run_async(lambda: self._api.add_comment(content, **kwargs))

    async def update_comment(self, comment_id: str, content: str, **kwargs) -> bool:
        return await run_async(
            lambda: self._api.update_comment(comment_id, content, **kwargs)
        )

    async def delete_comment(self, comment_id: str, **kwargs) -> bool:
        return await run_async(lambda: self._api.delete_comment(comment_id, **kwargs))

    async def get_label(self, label_id: str) -> Label:
        return await run_async(lambda: self._api.get_label(label_id))

    async def get_labels(self) -> List[Label]:
        return await run_async(lambda: self._api.get_labels())

    async def add_label(self, name: str, **kwargs) -> Label:
        return await run_async(lambda: self._api.add_label(name, **kwargs))

    async def update_label(self, label_id: str, **kwargs) -> bool:
        return await run_async(lambda: self._api.update_label(label_id, **kwargs))

    async def delete_label(self, label_id: str, **kwargs) -> bool:
        return await run_async(lambda: self._api.delete_label(label_id, **kwargs))

    async def get_shared_labels(self) -> List[str]:
        return await run_async(lambda: self._api.get_shared_labels())

    async def rename_shared_label(self, name: str, new_name: str) -> bool:
        return await run_async(lambda: self._api.rename_shared_label(name, new_name))

    async def remove_shared_label(self, name: str) -> bool:
        return await run_async(lambda: self._api.remove_shared_label(name))
