"""
部署引导命令：首次上线（或每次部署）时自动完成"能登录后台 + 拥有正确权限组"这两件事，
避免每次部署都要人工登录服务器手动执行 `createsuperuser`。

用法：
    python manage.py bootstrap_deployment

行为（幂等，可安全重复执行，适合放进部署脚本/容器启动脚本的 migrate 之后）：
    1. 若环境变量 DJANGO_SUPERUSER_USERNAME / DJANGO_SUPERUSER_EMAIL /
       DJANGO_SUPERUSER_PASSWORD 均已设置，且该用户名尚不存在，则创建一个超级管理员账号。
       - 若用户名已存在，跳过创建（不会重置密码，避免每次部署都覆盖已被人工修改过的密码）。
       - 若三个环境变量未完整设置，跳过此步骤并给出提示（适用于已手动创建过超管、
         或本地开发环境无需自动建号的场景）。
    2. 调用 `setup_rbac_groups` 命令初始化/重置 RBAC 权限组（详见该命令的说明）。

安全说明：
    - 密码只应通过环境变量/密钥管理服务注入，不会被写入日志。
    - 本命令不会修改已存在用户的密码或权限，避免误覆盖人工调整过的账号状态。
"""
import os

from django.contrib.auth import get_user_model
from django.core.management import call_command
from django.core.management.base import BaseCommand


class Command(BaseCommand):
    help = "部署引导：按需创建首个超级管理员账号 + 初始化 RBAC 权限组，可重复执行。"

    def handle(self, *args, **options):
        self._bootstrap_superuser()
        call_command("setup_rbac_groups")

    def _bootstrap_superuser(self):
        username = os.environ.get("DJANGO_SUPERUSER_USERNAME")
        email = os.environ.get("DJANGO_SUPERUSER_EMAIL")
        password = os.environ.get("DJANGO_SUPERUSER_PASSWORD")

        if not (username and email and password):
            self.stdout.write(
                self.style.WARNING(
                    "未完整设置 DJANGO_SUPERUSER_USERNAME / DJANGO_SUPERUSER_EMAIL / "
                    "DJANGO_SUPERUSER_PASSWORD，跳过自动创建超级管理员账号。"
                )
            )
            return

        User = get_user_model()
        if User.objects.filter(username=username).exists():
            self.stdout.write(
                self.style.SUCCESS(f"超级管理员账号 '{username}' 已存在，跳过创建。")
            )
            return

        User.objects.create_superuser(username=username, email=email, password=password)
        self.stdout.write(self.style.SUCCESS(f"已创建超级管理员账号 '{username}'。"))
