import argparse
from typing import Any

from django.core.management.base import CommandError

from zerver.actions.create_realm import do_create_realm
from zerver.actions.create_user import do_create_user
from zerver.lib.management import ZulipBaseCommand
from zerver.models import UserProfile


class Command(ZulipBaseCommand):
    help = """\
Create a new Zulip organization (realm) via the command line.

We recommend `./manage.py generate_realm_creation_link` for most
users, for several reasons:

* Has a more user-friendly web flow for account creation.
* Manages passwords in a more natural way.
* Automatically logs the user in during account creation.

This management command is available as an alternative for situations
where one wants to script the realm creation process.

Since every Zulip realm must have an owner, this command creates the
initial organization owner user for the new realm, using the same
workflow as `./manage.py create_user`.
"""

    def add_arguments(self, parser: argparse.ArgumentParser) -> None:
        parser.add_argument("realm_name", help="Name for the new organization")
        parser.add_argument(
            "--string-id",
            help="Subdomain for the new organization. Empty if root domain.",
            default="",
        )
        self.add_create_user_args(parser)

    def handle(self, *args: Any, **options: str) -> None:
        realm_name = options["realm_name"]
        string_id = options["string_id"]

        create_user_params = self.get_create_user_params(options)

        try:
            realm = do_create_realm(string_id=string_id, name=realm_name)
        except AssertionError as e:
            raise CommandError(str(e))

        do_create_user(
            create_user_params.email,
            create_user_params.password,
            realm,
            create_user_params.full_name,
            # Explicitly set tos_version=None. For servers that
            # have configured Terms of Service, this means that
            # users created via this mechanism will be prompted to
            # accept the Terms of Service on first login.
            role=UserProfile.ROLE_REALM_OWNER,
            realm_creation=True,
            tos_version=None,
            acting_user=None,
        )
