"""
Демо-аккаунты для входа в систему и админ-панель.

Запуск: python manage.py seed_demo_accounts
Повторный запуск обновляет пароли и демо-данные портфолио.

Пароли задаются в .env: DEMO_ADMIN_PASSWORD, DEMO_STUDENT_PASSWORD
(см. .env.example). Без них команда завершится с ошибкой.
"""

import os
from datetime import date

from django.conf import settings
from django.core.management.base import BaseCommand, CommandError

from portfolio.models import (
    Achievement,
    Education,
    Project,
    Skill,
    StudentProfile,
)
from users.models import User

ADMIN_EMAIL = "admin.demo@portfolio.test"
STUDENT_EMAIL = "student.demo@portfolio.test"


class Command(BaseCommand):
    help = "Создаёт демо-админа и демо-студента с полным портфолио."

    def handle(self, *args, **options):
        admin_pass = os.environ.get("DEMO_ADMIN_PASSWORD", "").strip()
        student_pass = os.environ.get("DEMO_STUDENT_PASSWORD", "").strip()
        if not admin_pass or not student_pass:
            raise CommandError(
                "Задайте в .env переменные DEMO_ADMIN_PASSWORD и DEMO_STUDENT_PASSWORD "
                "(см. .env.example)."
            )

        db = settings.DATABASES["default"]
        engine = db.get("ENGINE", "")
        name = db.get("NAME", "")
        self.stdout.write(f"Текущая БД: {engine} — {name!r}")
        self.stdout.write(
            "Проект использует только MySQL; команда должна выполняться с тем же .env, что и runserver."
        )
        self.stdout.write("")

        self._ensure_admin(admin_pass)
        self._ensure_student(student_pass)

        self.stdout.write("")
        self.stdout.write(self.style.SUCCESS("=== Демо-аккаунты готовы ==="))
        self.stdout.write("")
        self.stdout.write("Учётные данные задаются в .env (DEMO_*_PASSWORD).")
        self.stdout.write(f"Администратор (email): {ADMIN_EMAIL}")
        self.stdout.write(f"Студент (email):        {STUDENT_EMAIL}")
        self.stdout.write("")
        self.stdout.write(
            self.style.WARNING(
                "Смените пароли в продакшене. Эти учётные записи только для разработки."
            )
        )

    def _ensure_admin(self, password: str):
        user, created = User.objects.get_or_create(
            email=ADMIN_EMAIL,
            defaults={
                "username": "admin_demo",
                "first_name": "Админ",
                "last_name": "Демо",
                "role": User.Role.ADMIN,
                "is_active": True,
                "is_staff": True,
                "is_superuser": True,
                "is_verified": True,
            },
        )
        if not created:
            user.role = User.Role.ADMIN
            user.is_staff = True
            user.is_superuser = True
            user.is_verified = True
            user.is_active = True
        user.set_password(password)
        user.save()
        action = "Создан" if created else "Обновлён"
        self.stdout.write(self.style.NOTICE(f"{action} администратор: {ADMIN_EMAIL}"))

    def _ensure_student(self, password: str):
        user, created = User.objects.get_or_create(
            email=STUDENT_EMAIL,
            defaults={
                "username": "student_demo",
                "first_name": "Демо",
                "last_name": "Студент",
                "role": User.Role.STUDENT,
                "is_active": True,
                "is_verified": True,
            },
        )
        if not created:
            user.first_name = "Демо"
            user.last_name = "Студент"
            user.role = User.Role.STUDENT
            user.is_verified = True
            user.is_active = True
        user.set_password(password)
        user.save()

        profile, p_created = StudentProfile.objects.update_or_create(
            user=user,
            defaults={
                "first_name": "Демо",
                "last_name": "Студент",
                "patronymic": "Демонстрационный",
                "phone": "+79991234567",
                "bio": (
                    "Студент, увлекаюсь веб-разработкой и Python. "
                    "Активно участвую в олимпиадах и хакатонах."
                ),
                "student_group": "ИС-41",
                "specialty": "Информационные системы и программирование",
                "average_grade": 4.80,
            },
        )
        self.stdout.write(
            self.style.NOTICE(
                f"{'Создан' if p_created else 'Обновлён'} профиль студента"
            )
        )

        Education.objects.update_or_create(
            student=profile,
            institution="Пермский финансово-экономический колледж",
            specialty="Информационные системы и программирование",
            defaults={
                "degree": "Специалист среднего звена",
                "start_year": 2023,
                "end_year": 2026,
                "is_current": True,
            },
        )

        skills_data = [
            ("Python", "advanced", "programming"),
            ("Django", "intermediate", "programming"),
            ("SQL", "intermediate", "database"),
            ("Git", "intermediate", "tools"),
            ("JavaScript", "beginner", "programming"),
            ("HTML/CSS", "intermediate", "frontend"),
            ("Коммуникабельность", "advanced", "soft"),
            ("Работа в команде", "advanced", "soft"),
        ]
        for name, level, category in skills_data:
            Skill.objects.update_or_create(
                student=profile,
                name=name,
                defaults={"level": level, "category": category},
            )
        self.stdout.write(self.style.NOTICE("Навыки синхронизированы"))

        Project.objects.update_or_create(
            student=profile,
            title="Чат-бот для Telegram",
            defaults={
                "project_type": Project.ProjectType.PERSONAL,
                "description": (
                    "Разработал чат-бота на Django + aiogram для автоматизации ответов "
                    "на частые вопросы. Бот обработал более 1000 запросов."
                ),
                "technologies": "Python, Django, aiogram, SQLite",
                "github_link": "https://github.com/demo/telegram-bot",
                "start_date": date(2024, 9, 1),
                "end_date": date(2025, 1, 15),
            },
        )
        Project.objects.update_or_create(
            student=profile,
            title="Система управления студенческим портфолио",
            defaults={
                "project_type": Project.ProjectType.DIPLOMA,
                "description": (
                    "Дипломный проект: веб-приложение для сбора достижений студентов "
                    "и автоматической генерации резюме. Django, DRF, TailwindCSS."
                ),
                "technologies": "Python, Django, DRF, MySQL, TailwindCSS, Alpine.js",
                "github_link": "https://github.com/demo/portfolio-system",
                "start_date": date(2025, 2, 1),
                "end_date": date(2026, 3, 1),
            },
        )
        self.stdout.write(self.style.NOTICE("Проекты синхронизированы"))

        Achievement.objects.update_or_create(
            student=profile,
            title="Всероссийская олимпиада по программированию",
            defaults={
                "achievement_type": Achievement.AchievementType.OLYMPIAD,
                "date": date(2025, 4, 15),
                "result": "Диплом 3 степени",
                "organization": "Министерство образования РФ",
                "description": "Участвовал в финале олимпиады среди студентов СПО",
            },
        )
        Achievement.objects.update_or_create(
            student=profile,
            title="Сертификат Python Developer",
            defaults={
                "achievement_type": Achievement.AchievementType.CERTIFICATE,
                "date": date(2025, 8, 20),
                "result": "Пройден курс",
                "organization": "Stepik",
                "description": 'Курс "Python: основы и применение"',
            },
        )
        self.stdout.write(self.style.NOTICE("Достижения синхронизированы"))

        action = "Создан" if created else "Обновлён"
        self.stdout.write(self.style.NOTICE(f"{action} студент: {STUDENT_EMAIL}"))
