import webbrowser

from django.conf import settings
from django.core.management.commands.runserver import Command as DjangoRunserverCommand


class Command(DjangoRunserverCommand):
    help = "Inicia o servidor local Kreate4Web com diagnóstico e URLs de acesso."

    def add_arguments(self, parser):
        super().add_arguments(parser)
        parser.add_argument(
            "--open-browser",
            action="store_true",
            help="Abre a página inicial no navegador depois de iniciar o servidor.",
        )

    def handle(self, *args, **options):
        self.open_browser = options.pop("open_browser", False)
        return super().handle(*args, **options)

    def _prepare_local_settings(self):
        # O runserver é exclusivamente de desenvolvimento. Evita que um .env
        # de produção redirecione localhost para HTTPS, situação que faz o
        # navegador parecer indisponível apesar de o servidor estar ativo.
        changed = []
        for name in ("SECURE_SSL_REDIRECT", "SESSION_COOKIE_SECURE", "CSRF_COOKIE_SECURE"):
            if getattr(settings, name, False):
                setattr(settings, name, False)
                changed.append(name)

        allowed_hosts = list(getattr(settings, "ALLOWED_HOSTS", []))
        for host in ("127.0.0.1", "localhost", "[::1]"):
            if host not in allowed_hosts:
                allowed_hosts.append(host)
        settings.ALLOWED_HOSTS = allowed_hosts

        if changed:
            self.stdout.write(
                self.style.WARNING(
                    "Modo local: foram desativadas temporariamente as opções HTTPS "
                    f"{', '.join(changed)}."
                )
            )

    def inner_run(self, *args, **options):
        self._prepare_local_settings()
        return super().inner_run(*args, **options)

    def on_bind(self, server_port):
        super().on_bind(server_port)
        if self._raw_ipv6:
            host = f"[{self.addr}]"
        elif self.addr in {"0", "0.0.0.0"}:
            host = "127.0.0.1"
        else:
            host = self.addr
        base = f"http://{host}:{server_port}"
        self.stdout.write("")
        self.stdout.write(self.style.SUCCESS("Portal Kreate4Web disponível:"))
        self.stdout.write(f"  Login único:      {base}/")
        self.stdout.write(f"  Backoffice:       {base}/admin/")
        self.stdout.write(f"  Área do cliente:  {base}/portal/")
        self.stdout.write(f"  Segurança / 2FA:  {base}/seguranca/")
        self.stdout.write(f"  Diagnóstico:      {base}/health/")
        self.stdout.write(self.style.WARNING("Mantenha este terminal aberto enquanto utiliza o portal."))
        self.stdout.write("")
        if getattr(self, "open_browser", False):
            webbrowser.open(f"{base}/")
