#!/usr/bin/env python3

"""
NextCloud tasks console interface, basing on the async Python API and Textual.
The environment variables NEXTCLOUD_USER and NEXTCLOUD_PASS can be set to skip the login prompt.
"""

import argparse
import sys
from typing import Optional

from nextcloud_tasks_api import NextcloudTasksApiFactory, NextcloudTasksApi
from textual.app import App

from .screens import UnlockScreen, MainScreen
from .status import NotificationHandler


class KeePassApp(App[int]):
    """Main app, passing the API from the password/unlock screen to the task browser."""

    def __init__(self, api: NextcloudTasksApiFactory, default_list: Optional[str]) -> None:
        super().__init__()
        self._api: NextcloudTasksApiFactory = api
        self._default_list: Optional[str] = default_list

    def on_mount(self) -> None:
        NotificationHandler.configure_logging(self)
        self.push_screen(UnlockScreen(self._api), callback=self._on_unlock)

    def _on_unlock(self, api: Optional[NextcloudTasksApi]) -> None:
        if api is None:
            self.exit(0)
        else:
            self.push_screen(MainScreen(api, self._default_list), callback=self.exit)


def main() -> int:
    parser = argparse.ArgumentParser(description=__doc__.strip(),
                                     formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument("--task-list", metavar="NAME", type=str, default=None,
                        help="task list to initially select")
    parser.add_argument("--no-verify-ssl", action="store_const", const=True, default=False,
                        help="ignore certificate errors")
    parser.add_argument("url", metavar="URL", type=str,
                        help="NextCloud installation root URL")
    args = parser.parse_args()

    rv: Optional[int] = KeePassApp(NextcloudTasksApiFactory(
        base_url=args.url,
        verify_ssl=not args.no_verify_ssl,
        limit=1,
        timeout=30.0,
    ), args.task_list).run()
    return rv if rv is not None else 1


if __name__ == "__main__":
    sys.exit(main())