import wagtail_factories
from django.conf import settings
from django.core.management import call_command
from wagtail.models import Site, Page, Locale
from wagtail_localize.models import LocaleSynchronization

from vbv_lernwelt.core.admin import User
from vbv_lernwelt.learnpath.models import LearningPath, Topic, Circle, LearningSequence, LearningContent, LearningUnit, \
    LearningUnitQuestion
from vbv_lernwelt.learnpath.tests.learning_path_factories import LearningPathFactory, TopicFactory, CircleFactory, \
    LearningSequenceFactory, LearningContentFactory, VideoBlockFactory, PodcastBlockFactory, CompetenceBlockFactory, \
    ExerciseBlockFactory, DocumentBlockFactory, LearningUnitFactory, LearningUnitQuestionFactory


def create_circle(title, learning_path):
    return CircleFactory(
        title=title,
        parent=learning_path,
        description="""
    Nach dem Gespräch werten sie die Analyse aus und erstellen mit den
    zur Verfügung stehenden Systemen formal korrekte Lösungsvorschläge bzw.
    Ausschreibungen. Je nach Komplexität der Situation ziehen sie die nötigen
    Fachspezialisten bei.
            """,
        job_situations=[
            ('job_situation', 'Absicherung der Familie'),
            ('job_situation', 'Prämien einsparen'),
            ('job_situation', 'Deckung optimieren'),
            ('job_situation', 'Auto kaufen'),
            ('job_situation', 'Fahrzeugwechsel'),
            ('job_situation', 'Pensionerung inklusive Variante Frühpensionierung'),
            ('job_situation', 'Reisen'),
        ],
        goals=[
            ('goal', '... die heutige Versicherungssituation von Privat- oder Geschäftskunden einzuschätzen.'),
            ('goal', '... deinem Kunden einen ungenügenden oder übermässigen Versicherungsschutz aufzuzeigen.'),
            ('goal', '... deinem Kunden zu helfen, sein Optimierungspotential voll auszuschöpfen.'),
            ('goal', '... deinem Kunden seine optimale Lösung aufzuzeigen'),
        ],
        experts=[
            ('person', {'last_name': 'Huggel', 'first_name': 'Patrizia', 'email': 'patrizia.huggel@example.com'}),
        ]
    )


def create_circle_children(circle, title):
    LearningSequenceFactory(title='Starten', parent=circle, icon='it-icon-ls-start')
    LearningContentFactory(
        title=f'Einleitung Circle "{title}"',
        parent=circle,
        minutes=15,
        contents=[('video', VideoBlockFactory(
            url='https://www.youtube.com/embed/qhPIfxS2hvI',
            description='In dieser Circle zeigt dir ein Fachexperte anhand von Kundensituationen, wie du erfolgreich'
                        'den Kundenbedarf ermitteln, analysieren, priorisieren und anschliessend zusammenfassen kannst.'
        ))]
    )

    LearningSequenceFactory(title='Beobachten', parent=circle, icon='it-icon-ls-watch')
    lu = LearningUnitFactory(
        title='Absicherung der Familie',
        parent=circle,
    )
    LearningUnitQuestionFactory(
        title="Ich bin in der Lage, mit geeigneten Fragestellungen die Deckung von Versicherungen zu erfassen.",
        parent=lu
    )
    LearningUnitQuestionFactory(
        title="Zweite passende Frage zu 'Absicherung der Familie'",
        parent=lu
    )
    LearningContentFactory(
        title='Ermittlung des Kundenbedarfs',
        parent=circle,
        minutes=30,
        contents=[('podcast', PodcastBlockFactory(
            description='Die Ermittlung des Kundenbedarfs muss in einem eingehenden Gespräch herausgefunden werden. Höre dazu auch diesen Podcast an.',
            url='https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/325190984&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true&visual=true',
        ))]
    )
    LearningContentFactory(
        title='Kundenbedürfnisse erkennen',
        parent=circle,
        minutes=30,
        contents=[('competence', CompetenceBlockFactory())]
    )
    LearningContentFactory(
        title='Was braucht eine Familie?',
        parent=circle,
        minutes=60,
        contents=[('exercise', ExerciseBlockFactory())]
    )

    LearningSequenceFactory(title='Anwenden', parent=circle, icon='it-icon-ls-apply')
    lu = LearningUnitFactory(title='Prämien einsparen', parent=circle)
    LearningUnitQuestionFactory(
        title="Passende Frage zu Anwenden",
        parent=lu
    )
    LearningContentFactory(
        title='Versicherungsbedarf für Familien',
        parent=circle,
        minutes=60,
        contents=[('exercise', ExerciseBlockFactory())]
    )
    LearningContentFactory(
        title='Alles klar?',
        parent=circle,
        minutes=60,
        contents=[('exercise', ExerciseBlockFactory())]
    )

    lu = LearningUnitFactory(title='Sich selbständig machen', parent=circle)
    LearningUnitQuestionFactory(
        title="Passende Frage zu 'Sich selbständig machen'",
        parent=lu
    )
    LearningContentFactory(
        title='GmbH oder AG',
        parent=circle,
        minutes=120,
        contents=[('video', VideoBlockFactory())]
    )
    LearningContentFactory(
        title='Tiertherapie Patrizia Feller',
        parent=circle,
        minutes=120,
        contents=[('exercise', ExerciseBlockFactory())]
    )

    lu = LearningUnitFactory(title='Auto verkaufen', parent=circle)
    LearningUnitQuestionFactory(
        title='Passende Frage zu "Auto verkaufen"',
        parent=lu
    )
    LearningContentFactory(
        title='Motorfahrzeugversicherung',
        parent=circle,
        minutes=240,
        contents=[('competence', CompetenceBlockFactory())]
    )
    LearningContentFactory(
        title='Nora kauft sich ein neues Auto',
        parent=circle,
        minutes=60,
        contents=[('podcast', PodcastBlockFactory())]
    )
    LearningContentFactory(
        title='Ermittlung des Kundenbedarfs',
        parent=circle,
        minutes=120,
        contents=[('document', DocumentBlockFactory())]
    )
    LearningContentFactory(
        title='Motorfahrzeug kaufen',
        parent=circle,
        minutes=120,
        contents=[('exercise', ExerciseBlockFactory())]
    )

    lu = LearningUnitFactory(title='Pensionierung', parent=circle)
    LearningUnitQuestionFactory(
        title='Passende Frage zu "Pensionierung"',
        parent=lu
    )
    LearningContentFactory(
        title='3-Säulen-Prinzip',
        parent=circle,
        minutes=240,
        contents=[('competence', CompetenceBlockFactory())]
    )
    LearningContentFactory(
        title='Altersvorsorge',
        parent=circle,
        minutes=240,
        contents=[('competence', CompetenceBlockFactory())]
    )
    LearningContentFactory(
        title='AHV',
        parent=circle,
        minutes=120,
        contents=[('document', DocumentBlockFactory())]
    )
    LearningContentFactory(
        title='Altersvorsorge planen',
        parent=circle,
        minutes=120,
        contents=[('exercise', ExerciseBlockFactory())]
    )

    lu = LearningUnitFactory(title='Reisen', parent=circle)
    LearningUnitQuestionFactory(
        title='Passende Frage zu "Reisen"',
        parent=lu
    )
    LearningContentFactory(
        title='Reiseversicherung',
        parent=circle,
        minutes=240,
        contents=[('competence', CompetenceBlockFactory())]
    )
    LearningContentFactory(
        title='Sorgenfrei reisen',
        parent=circle,
        minutes=120,
        contents=[('exercise', ExerciseBlockFactory())]
    )

    lu = LearningUnitFactory(title='Haushalt', parent=circle)
    LearningUnitQuestionFactory(
        title='Passende Frage zu "Haushalt"',
        parent=lu
    )
    LearningContentFactory(
        title='Privathaftpflicht',
        parent=circle,
        minutes=240,
        contents=[('competence', CompetenceBlockFactory())]
    )
    LearningContentFactory(
        title='Zusatzversicherung',
        parent=circle,
        minutes=120,
        contents=[('document', DocumentBlockFactory())]
    )
    LearningContentFactory(
        title='Einen eigenen Haushalt führen',
        parent=circle,
        minutes=120,
        contents=[('exercise', ExerciseBlockFactory())]
    )

    LearningSequenceFactory(title='Üben', parent=circle, icon='it-icon-ls-practice')
    lu = LearningUnitFactory(title='Kind zieht von zu Hause aus', parent=circle)
    LearningUnitQuestionFactory(
        title='Passende Frage zu "Kind zieht von zu Hause aus"',
        parent=lu
    )
    LearningContentFactory(
        title='Hausrat',
        parent=circle,
        minutes=120,
        contents=[('competence', CompetenceBlockFactory())]
    )
    LearningContentFactory(
        title='Privathaftpflicht',
        parent=circle,
        minutes=60,
        contents=[('competence', CompetenceBlockFactory())]
    )
    LearningContentFactory(
        title='Kind zieht von zu Hause wirklich aus',
        parent=circle,
        minutes=60,
        contents=[('competence', CompetenceBlockFactory())]
    )

    LearningSequenceFactory(title='Testen', parent=circle, icon='it-icon-ls-test')
    lu = LearningUnitFactory(title='Kind zieht von zu Hause aus "Testen"', parent=circle)
    LearningContentFactory(
        title='Das erwartet dich im Test',
        parent=circle,
        minutes=30,
        contents=[('document', CompetenceBlockFactory())]
    )
    LearningContentFactory(
        title='Test durchführen',
        parent=circle,
        minutes=30,
        contents=[('document', CompetenceBlockFactory())]
    )

    LearningSequenceFactory(title='Vernetzen', parent=circle, icon='it-icon-ls-network')
    LearningContentFactory(
        title='Online Training',
        parent=circle,
        minutes=60,
        contents=[('document', CompetenceBlockFactory())]
    )

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


def create_default_learning_path(user=None, skip_locales=True):
    if user is None:
        user = User.objects.get(username='info@iterativ.ch')

    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()


    # create_default_competences()

    lp = LearningPathFactory(title="Versicherungsvermittler/in", parent=site.root_page)

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

    circle_basis = CircleFactory(
        title="Basis",
        parent=lp,
        description="""
In diesem Circle erklären wir dir, wie der Lehrgang
Versicherungsvermittler / in " aufgebaut ist. Zudem vermitteln wir dir die wichtigsten Grundlagen,
damit erfolgreich mit deinem Lernpfad starten kannst.
""",
    )
    LearningSequenceFactory(title='Starten', parent=circle_basis, icon='it-icon-ls-start')
    LearningContentFactory(
        title='Einleitung Circle "Basis"',
        parent=circle_basis,
        minutes=15,
        contents=[('video', VideoBlockFactory(
            url='https://www.youtube.com/embed/qhPIfxS2hvI',
            description='In dieser Circle zeigt dir ein Fachexperte anhand von Kundensituationen, wie du erfolgreich'
                        'den Kundenbedarf ermitteln, analysieren, priorisieren und anschliessend zusammenfassen kannst.'
        ))]
    )
    LearningSequenceFactory(title='Beenden', parent=circle_basis, icon='it-icon-ls-end')
    LearningContentFactory(
        title='Kompetenzprofil anschauen',
        parent=circle_basis,
        minutes=30,
        contents=[('document', CompetenceBlockFactory())]
    )
    LearningContentFactory(
        title='Circle "Analyse" abschliessen',
        parent=circle_basis,
        minutes=30,
        contents=[('document', CompetenceBlockFactory())]
    )


    TopicFactory(title="Gewinnen von Kunden", parent=lp)

    circle_gewinnen = CircleFactory(
        title="Gewinnen",
        parent=lp,
        description="""
Versicherungsvermittlerinnen und -vermittler verfügen über
ein starkes Netzwerk, das sie gezielt pflegen und ausbauen. Sie beraten und betreuen ihre bestehenden Kundinnen und Kunden professionell und gewinnen so ihr Vertrauen. Dadurch schaffen sie die Basis für das Gewinnen
von neuen Kundinnen und Kunden. Versicherungsvermittlerinnen und -vermittler sprechen ihre bestehenden Kundinnen
und Kunden auf Weiterempfehlung an. So nutzen sie ihre
bestehenden Kontakte geschickt für das Anwerben von
Neukundinnen und -kunden.""",
        goals=[
            ('goal', '... Bestehende Kunden so zu beraten, dass sie von diesen weiterempfohlen werden'),
            ('goal', '... Geeignete Personen wie z.B. Garagisten, Architekten, Treuhänder auf die Vermittlung / Zusammenarbeit anzusprechen'),
            ('goal', '... Verschiedene Datenquellen wie Internet, Telefonbuch, Handelszeitung, Baugesuche etc. Gezielt für die Gewinnung von Neukunden zu benützen'),
            ('goal', '... Ein beliebiges Gespräch resp. Einen bestehenden Kontakt in die Richtung «Versicherung» zu lenken'),
            ('goal', '... Das Thema Risiko und Sicherheit in einem Gespräch gezielt und auf die Situation des jeweiligen Gesprächspartners bezogen einfliessen zu lassen'),
            ('goal', '... Im täglichen Kontakt potenzielle Kundinnen und Kunden zu erkennen'),
        ],
    )
    create_circle_children(circle_gewinnen, 'Gewinnen')

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

    circle_einstieg = create_circle('Einstieg', lp)
    create_circle_children(circle_einstieg, 'Einstieg')

    circle_analyse = create_circle('Analyse', lp)
    create_circle_children(circle_analyse, 'Analyse')

    circle_analyse = create_circle('Lösung', lp)
    create_circle_children(circle_analyse, 'Lösung')

    circle_analyse = create_circle('Abschluss', lp)
    create_circle_children(circle_analyse, 'Abschluss')

    TopicFactory(title="Betreuen und Ausbauen des Kundenstamms", parent=lp)

    circle_analyse = create_circle('Betreuen', lp)
    create_circle_children(circle_analyse, 'Betreuen')

    TopicFactory(title="Prüfung", is_visible=True, parent=lp)
    circle_analyse = create_circle('Prüfungs- vorbereitung', lp)
    create_circle_children(circle_analyse, 'Prüfungs- vorbereitung')


    # locales
    if not skip_locales:
        locale_de = Locale.objects.get(language_code='de-CH')
        locale_fr, _ = Locale.objects.get_or_create(language_code='fr-CH')
        LocaleSynchronization.objects.get_or_create(
            locale_id=locale_fr.id,
            sync_from_id=locale_de.id
        )
        locale_it, _ = Locale.objects.get_or_create(language_code='it-CH')
        LocaleSynchronization.objects.get_or_create(
            locale_id=locale_it.id,
            sync_from_id=locale_de.id
        )
        call_command('sync_locale_trees')

    # all pages belong to 'admin' by default
    Page.objects.update(owner=user)


def delete_default_learning_path():
    LearningContent.objects.all().delete()
    LearningUnitQuestion.objects.all().delete()
    LearningUnit.objects.all().delete()
    LearningSequence.objects.all().delete()
    Circle.objects.all().delete()
    Topic.objects.all().delete()
    LearningPath.objects.all().delete()
