import json

import wagtail_factories
from django.conf import settings
from wagtail.models import Site

from vbv_lernwelt.competence.factories import (
    CompetencePageFactory,
    CompetenceProfilePageFactory,
    PerformanceCriteriaFactory,
)
from vbv_lernwelt.competence.models import CompetencePage
from vbv_lernwelt.core.tests.helpers import create_locales_for_wagtail
from vbv_lernwelt.course.consts import COURSE_TEST_ID
from vbv_lernwelt.course.factories import CoursePageFactory
from vbv_lernwelt.course.models import Course, CourseCategory, CoursePage
from vbv_lernwelt.learnpath.models import LearningUnit
from vbv_lernwelt.learnpath.tests.learning_path_factories import (
    CircleFactory,
    DocumentBlockFactory,
    ExerciseBlockFactory,
    LearningContentFactory,
    LearningModuleBlockFactory,
    LearningPathFactory,
    LearningSequenceFactory,
    LearningUnitFactory,
    OnlineTrainingBlockFactory,
    TestBlockFactory,
    TopicFactory,
)
from vbv_lernwelt.media_library.tests.media_library_factories import (
    create_external_link_block,
    create_learn_media_block,
    create_media_collection,
    ExternalLinkBlockFactory,
    LearnMediaBlockFactory,
    MediaCategoryPageFactory,
    MediaLibraryPageFactory,
)


def create_test_course():
    create_locales_for_wagtail()
    create_test_course_with_categories()
    create_test_learning_path()
    create_test_competence_profile()
    create_test_media_library()


def create_test_course_with_categories(apps=None, schema_editor=None):
    if apps is not None:
        Course = apps.get_model("course", "Course")
        CourseCategory = apps.get_model("course", "CourseCategory")
    else:
        # pylint: disable=import-outside-toplevel
        from vbv_lernwelt.course.models import Course, CourseCategory

    course, _ = Course.objects.get_or_create(
        id=COURSE_TEST_ID, title="Test Lehrgang", category_name="Handlungsfeld"
    )

    CourseCategory.objects.get_or_create(course=course, title="Allgemein", general=True)

    for cat in [
        "Fahrzeug",
        "Reisen",
    ]:
        CourseCategory.objects.get_or_create(course=course, title=cat)

    # create default course page
    site = Site.objects.filter(is_default_site=True).first()
    if not site:
        site = wagtail_factories.SiteFactory(is_default_site=True)

    if settings.APP_ENVIRONMENT == "development":
        site.port = 8000
        site.save()

    course_page = CoursePageFactory(
        title="Test Lehrgang",
        parent=site.root_page,
        course=course,
    )
    course.slug = course_page.slug
    course.save()


def create_test_learning_path(user=None, skip_locales=True):
    course_page = CoursePage.objects.get(course_id=COURSE_TEST_ID)
    lp = LearningPathFactory(title="Test Lernpfad", parent=course_page)

    TopicFactory(title="Basis", is_visible=False, parent=lp)

    circle_basis = CircleFactory(
        title="Basis",
        parent=lp,
        description="Basis",
    )
    LearningSequenceFactory(
        title="Starten", parent=circle_basis, icon="it-icon-ls-start"
    )
    LearningUnitFactory(title="Einführung", parent=circle_basis)
    LearningContentFactory(
        title="Einführung",
        parent=circle_basis,
        minutes=15,
        contents=[("document", DocumentBlockFactory())],
    )
    LearningSequenceFactory(title="Beenden", parent=circle_basis, icon="it-icon-ls-end")
    LearningUnitFactory(title="Beenden", parent=circle_basis)
    LearningContentFactory(
        title="Jetzt kann es losgehen!",
        parent=circle_basis,
        minutes=30,
        contents=[("document", DocumentBlockFactory())],
    )

    TopicFactory(title="Beraten der Kunden", parent=lp)

    circle = CircleFactory(
        title="Analyse",
        parent=lp,
        description="Unit-Test Circle",
        job_situations=[
            ("job_situation", "Autoversicherung"),
            ("job_situation", "Autokauf"),
        ],
        goals=[
            (
                "goal",
                "... die heutige Versicherungssituation von Privat- oder Geschäftskunden einzuschätzen.",
            ),
            ("goal", "... deinem Kunden seine optimale Lösung aufzuzeigen"),
        ],
    )

    LearningSequenceFactory(title="Starten", parent=circle, icon="it-icon-ls-start")
    LearningUnitFactory(title="Einführung", parent=circle)
    LearningContentFactory(
        title=f'Einleitung Circle "Analyse"',
        parent=circle,
        minutes=15,
        contents=[("document", DocumentBlockFactory())],
    )

    LearningSequenceFactory(title="Beobachten", parent=circle, icon="it-icon-ls-watch")
    lu = LearningUnitFactory(
        title="Fahrzeug",
        parent=circle,
        course_category=CourseCategory.objects.get(
            course_id=COURSE_TEST_ID, title="Fahrzeug"
        ),
    )
    LearningContentFactory(
        title="Rafael Fasel wechselt sein Auto",
        parent=circle,
        minutes=30,
        contents=[
            (
                "online_training",
                OnlineTrainingBlockFactory(
                    description="In diesem Online-Training lernst du, wie du den Kundenbedarf ermittelst.",
                    url="",
                ),
            )
        ],
    )
    LearningContentFactory(
        title="Fachcheck Fahrzeug",
        parent=circle,
        minutes=30,
        contents=[("test", TestBlockFactory())],
    )

    lu = LearningUnitFactory(
        title="Reisen",
        parent=circle,
        course_category=CourseCategory.objects.get(
            course_id=COURSE_TEST_ID, title="Reisen"
        ),
    )
    LearningContentFactory(
        title="Reiseversicherung",
        parent=circle,
        minutes=240,
        contents=[("exercise", ExerciseBlockFactory())],
    )
    LearningContentFactory(
        title="Emma und Ayla campen durch Amerika",
        parent=circle,
        minutes=120,
        contents=[
            (
                "learningmodule",
                LearningModuleBlockFactory(
                    url="/static/media/web_based_trainings/story-06-a-01-emma-und-ayla-campen-durch-amerika-einstieg/scormcontent/index.html"
                ),
            )
        ],
    )

    LearningSequenceFactory(title="Beenden", parent=circle, icon="it-icon-ls-end")
    LearningUnitFactory(title="Beenden", parent=circle)
    LearningContentFactory(
        title="KompetenzNavi anschauen",
        parent=circle,
        minutes=30,
        contents=[("document", DocumentBlockFactory())],
    )
    LearningContentFactory(
        title='Circle "Analyse" abschliessen',
        parent=circle,
        minutes=30,
        contents=[("document", DocumentBlockFactory())],
    )


def create_test_competence_profile():
    course = Course.objects.get(id=COURSE_TEST_ID)
    course_page = CoursePage.objects.get(course_id=COURSE_TEST_ID)

    competence_profile_page = CompetenceProfilePageFactory(
        title="KompetenzNavi",
        parent=course_page,
    )

    competences = [
        {
            "competence_id": "X1",
            "title": "Weiterempfehlung für Neukunden generieren",
            "items": [
                "Verhandlungsgeschick",
                "Überzeugtes Auftreten",
            ],
        },
        {
            "competence_id": "Y1",
            "title": "Wünsche, Ziele  und Bedürfnisse der Kunden im Gespräch ermitteln",
            "items": [
                "Gesprächsführung",
                "Fragetechniken",
                "Kundenpsychologie",
            ],
        },
        {
            "competence_id": "Y2",
            "title": "Analyse des Kundenbedarfs und des Kundenbedürfnisses durchführen",
            "items": [
                "Fragetechniken",
                "Visuelle Hilfsmittel / Visualisierungstechniken",
            ],
        },
    ]

    for c in competences:
        CompetencePageFactory(
            parent=competence_profile_page,
            competence_id=c["competence_id"],
            title=c["title"],
            items=[("item", i) for i in c["items"]],
        )

    PerformanceCriteriaFactory(
        parent=CompetencePage.objects.get(competence_id="Y1"),
        competence_id="Y1.3",
        title="Innerhalb des Handlungsfelds «Fahrzeug» bin ich fähig, die Ziele und Pläne des Kunden zu ergründen (SOLL).",
        learning_unit=LearningUnit.objects.get(
            slug="test-lehrgang-lp-circle-analyse-lu-fahrzeug"
        ),
    )
    PerformanceCriteriaFactory(
        parent=CompetencePage.objects.get(competence_id="Y2"),
        competence_id="Y2.1",
        title="Innerhalb des Handlungsfelds «Fahrzeug» bin ich fähig, die IST-Situation des Kunden mit der geeigneten Gesprächs-/Fragetechnik zu erfassen.",
        learning_unit=LearningUnit.objects.get(
            slug="test-lehrgang-lp-circle-analyse-lu-fahrzeug"
        ),
    )

    PerformanceCriteriaFactory(
        parent=CompetencePage.objects.get(competence_id="Y1"),
        competence_id="Y1.3",
        title="Innerhalb des Handlungsfelds «Reisen» bin ich fähig, die Ziele und Pläne des Kunden zu ergründen (SOLL).",
        learning_unit=LearningUnit.objects.get(
            slug="test-lehrgang-lp-circle-analyse-lu-reisen"
        ),
    )


def create_test_media_library():
    course = Course.objects.get(id=COURSE_TEST_ID)
    course_page = CoursePage.objects.get(course_id=COURSE_TEST_ID)

    media_lib_page = MediaLibraryPageFactory(
        title="Mediathek",
        parent=course_page,
    )

    icons = [
        "icon-hf-fahrzeug",
        "icon-hf-reisen",
        "icon-hf-einkommenssicherung",
    ]
    for idx, cat in enumerate(course.coursecategory_set.all()):
        overview_icon = icons[(idx + 2) % len(icons)]
        introduction_text = """
Das Auto ist für viele der grösste Stolz! Es birgt aber auch ein grosses Gefahrenpotenzial.
Dabei geht es bei den heutigen Fahrzeugpreisen und Reparaturkosten rasch um namhafte Summen,
die der Fahrzeugbesitzer und die Fahrzeugbesitzerin in einem grösseren Schadenfall oft nur schwer selbst aufbringen kann.""".strip()
        description_title = "Das erwartet dich in diesem Handlungsfeld"
        description_text = """
In diesem berufstypischem Handlungsfeld lernst du alles rund um Motorfahrzeugversicherungen,
wie man sein Auto optimal schützen kann, wie du vorgehst bei einem Fahrzeugwechsel,
welche Aspekte du bei einer Offerte beachten musst und wie du dem Kunden die Lösung präsentierst.""".strip()
        items = [
            ("item", "Motorfahrzeughaftpflichtversicherung"),
            ("item", "Motorfahrzeugkaskoversicherung"),
            ("item", "Insassenunfallversicherung"),
        ]
        body_data = json.dumps(
            [
                create_media_collection(
                    title="Lernmedien",
                    contents=[
                        create_learn_media_block(LearnMediaBlockFactory()),
                        create_learn_media_block(LearnMediaBlockFactory()),
                        create_learn_media_block(LearnMediaBlockFactory()),
                        create_learn_media_block(LearnMediaBlockFactory()),
                    ],
                ),
                create_media_collection(
                    title="Links",
                    contents=[
                        create_external_link_block(
                            ExternalLinkBlockFactory(
                                title="Nationales Versicherungsbüro",
                                url="https://www.vbv.ch/",
                            )
                        ),
                        create_external_link_block(
                            ExternalLinkBlockFactory(
                                title="Adressen der Strassenverkehrsämter",
                                url="https://www.vbv.ch/",
                            )
                        ),
                    ],
                ),
            ]
        )
        media_category = MediaCategoryPageFactory(
            overview_icon=overview_icon,
            title=cat.title,
            course_category=cat,
            parent=media_lib_page,
            introduction_text=introduction_text,
            description_title=description_title,
            description_text=description_text,
            items=items,
            body=body_data,
        )
