import os
import sys
from pathlib import Path

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "portfolio_system.settings")
BASE_DIR = Path(__file__).resolve().parent.parent
if str(BASE_DIR) not in sys.path:
    sys.path.insert(0, str(BASE_DIR))

import django  # noqa: E402

django.setup()

from django.test import Client  # noqa: E402
from rest_framework.test import APIClient  # noqa: E402
from users.models import User  # noqa: E402


def to_payload(resp):
    try:
        return resp.json()
    except Exception:
        return {}


def print_step(name, ok, extra=""):
    status = "OK" if ok else "FAIL"
    print(f"[{status}] {name} {extra}".strip())


def main():
    web = Client()
    api = APIClient()

    # 1) Регистрация
    r_page = web.get("/register/")
    print_step("Сценарий 1: /register/", r_page.status_code == 200, f"status={r_page.status_code}")

    email = "qa.student@portfolio.test"
    password = "StrongPass123!"
    User.objects.filter(email=email).delete()

    reg_resp = api.post(
        "/api/auth/register/",
        {
            "first_name": "Иван",
            "last_name": "Иванов",
            "patronymic": "Иванович",
            "email": email,
            "student_group": "ТЕСТ-01",
            "password": password,
        },
        format="json",
    )
    reg_data = to_payload(reg_resp)
    print_step(
        "Сценарий 1: регистрация API",
        reg_resp.status_code == 201,
        f"status={reg_resp.status_code} detail={reg_data.get('detail')}",
    )

    # 2) Вход
    login_resp = api.post("/api/auth/login/", {"email": email, "password": password}, format="json")
    login_data = to_payload(login_resp)
    print_step(
        "Сценарий 2: вход",
        login_resp.status_code == 200 and bool(login_data.get("access")),
        f"status={login_resp.status_code}",
    )
    access = login_data.get("access")
    refresh = login_data.get("refresh")
    api.credentials(HTTP_AUTHORIZATION=f"Bearer {access}")

    # 3) Профиль + разделы
    me_resp = api.put(
        "/api/profile/",
        {
            "first_name": "Иван",
            "last_name": "Иванов",
            "patronymic": "Иванович",
            "phone": "+79990000000",
            "student_group": "ТЕСТ-01",
            "specialty": "Программная инженерия",
            "bio": "Тестовый профиль",
        },
        format="json",
    )
    print_step("Сценарий 3: личные данные", me_resp.status_code == 200, f"status={me_resp.status_code}")

    edu_resp = api.post(
        "/api/profile/education/",
        {
            "institution": "Тестовый ВУЗ",
            "specialty": "Информатика",
            "degree": "Бакалавр",
            "start_year": 2022,
            "end_year": 2026,
            "is_current": False,
        },
        format="json",
    )
    skill_resp = api.post(
        "/api/profile/skills/",
        {"name": "Django", "level": "advanced", "category": "backend"},
        format="json",
    )
    proj_resp = api.post(
        "/api/profile/projects/",
        {
            "title": "Портфолио",
            "project_type": "personal",
            "description": "Описание проекта",
            "technologies": "Python, Django",
        },
        format="json",
    )
    print_step("Сценарий 3: образование", edu_resp.status_code in (200, 201), f"status={edu_resp.status_code}")
    print_step("Сценарий 3: навык", skill_resp.status_code in (200, 201), f"status={skill_resp.status_code}")
    print_step("Сценарий 3: проект", proj_resp.status_code in (200, 201), f"status={proj_resp.status_code}")

    # 4) Генерация резюме
    tpl_resp = api.get("/api/templates/")
    tpl_data = to_payload(tpl_resp)
    templates = tpl_data if isinstance(tpl_data, list) else tpl_data.get("results", [])
    template_id = templates[0]["id"] if templates else None

    analyze_resp = api.post(
        "/api/resume/analyze/",
        {"vacancy_text": "Ищем Python разработчика с Django"},
        format="json",
    )
    gen_resp = api.post(
        "/api/resume/generate/",
        {
            "vacancy_text": "Ищем Python разработчика с Django",
            "template_id": template_id,
            "is_public": False,
        },
        format="json",
    )
    gen_data = to_payload(gen_resp)
    resume_id = gen_data.get("id")
    print_step("Сценарий 4: анализ", analyze_resp.status_code == 200, f"status={analyze_resp.status_code}")
    print_step("Сценарий 4: генерация", gen_resp.status_code == 201 and bool(resume_id), f"status={gen_resp.status_code}")

    # 5) Экспорт
    html_resp = api.get(f"/api/resume/{resume_id}/export/html/")
    pdf_resp = api.get(f"/api/resume/{resume_id}/export/pdf/")
    docx_resp = api.get(f"/api/resume/{resume_id}/export/docx/")
    print_step("Сценарий 5: HTML", html_resp.status_code == 200, f"status={html_resp.status_code}")
    print_step("Сценарий 5: PDF", pdf_resp.status_code in (200, 404), f"status={pdf_resp.status_code}")
    print_step("Сценарий 5: DOCX", docx_resp.status_code in (200, 404), f"status={docx_resp.status_code}")

    # 6) История
    hist_resp = api.get("/api/resume/history/")
    hist_data = to_payload(hist_resp)
    detail_resp = api.get(f"/api/resume/{resume_id}/")
    has_items = isinstance(hist_data, list) and len(hist_data) > 0
    print_step("Сценарий 6: история", hist_resp.status_code == 200 and has_items, f"status={hist_resp.status_code}")
    print_step("Сценарий 6: просмотр", detail_resp.status_code == 200, f"status={detail_resp.status_code}")

    # 7) Админка
    api_admin = APIClient()
    admin_login = api_admin.post(
        "/api/auth/login/",
        {"email": "admin.demo@portfolio.test", "password": "AdminDemo2024!"},
        format="json",
    )
    admin_data = to_payload(admin_login)
    api_admin.credentials(HTTP_AUTHORIZATION=f"Bearer {admin_data.get('access')}")
    users_resp = api_admin.get("/api/admin/users/")
    users_data = to_payload(users_resp)
    users = users_data.get("results", []) if isinstance(users_data, dict) else users_data
    one_id = users[0]["id"] if users else None
    detail_admin = api_admin.get(f"/api/admin/users/{one_id}/") if one_id else None
    verify_admin = api_admin.post(f"/api/admin/users/{one_id}/verify/") if one_id else None
    print_step("Сценарий 7: вход админа", admin_login.status_code == 200, f"status={admin_login.status_code}")
    print_step("Сценарий 7: список студентов", users_resp.status_code == 200 and bool(users), f"status={users_resp.status_code}")
    print_step("Сценарий 7: карточка студента", bool(detail_admin and detail_admin.status_code == 200), f"status={getattr(detail_admin, 'status_code', None)}")
    print_step("Сценарий 7: подтверждение", bool(verify_admin and verify_admin.status_code == 200), f"status={getattr(verify_admin, 'status_code', None)}")

    # 8) Выход
    logout_resp = api.post("/api/auth/logout/", {"refresh": refresh}, format="json")
    print_step("Сценарий 8: выход", logout_resp.status_code == 200, f"status={logout_resp.status_code}")


if __name__ == "__main__":
    main()
