# Generated by Django 3.0.3 on 2020-05-08 14:30

from django.apps.registry import Apps
from django.db import migrations
from django.db.backends.base.schema import BaseDatabaseSchemaEditor

from passbook.flows.models import FlowDesignation
from passbook.stages.identification.models import Templates, UserFields


def create_default_flow(apps: Apps, schema_editor: BaseDatabaseSchemaEditor):
    Flow = apps.get_model("passbook_flows", "Flow")
    FlowStageBinding = apps.get_model("passbook_flows", "FlowStageBinding")
    PasswordStage = apps.get_model("passbook_stages_password", "PasswordStage")
    UserLoginStage = apps.get_model("passbook_stages_user_login", "UserLoginStage")
    IdentificationStage = apps.get_model(
        "passbook_stages_identification", "IdentificationStage"
    )
    db_alias = schema_editor.connection.alias

    if Flow.objects.using(db_alias).all().exists():
        # Only create default flow when none exist
        return

    if not IdentificationStage.objects.using(db_alias).exists():
        IdentificationStage.objects.using(db_alias).create(
            name="identification",
            user_fields=[UserFields.E_MAIL],
            template=Templates.DEFAULT_LOGIN,
        )

    if not PasswordStage.objects.using(db_alias).exists():
        PasswordStage.objects.using(db_alias).create(
            name="password", backends=["django.contrib.auth.backends.ModelBackend"],
        )

    if not UserLoginStage.objects.using(db_alias).exists():
        UserLoginStage.objects.using(db_alias).create(name="authentication")

    flow = Flow.objects.using(db_alias).create(
        name="default-authentication-flow",
        slug="default-authentication-flow",
        designation=FlowDesignation.AUTHENTICATION,
    )
    FlowStageBinding.objects.using(db_alias).create(
        flow=flow, stage=IdentificationStage.objects.using(db_alias).first(), order=0,
    )
    FlowStageBinding.objects.using(db_alias).create(
        flow=flow, stage=PasswordStage.objects.using(db_alias).first(), order=1,
    )
    FlowStageBinding.objects.using(db_alias).create(
        flow=flow, stage=UserLoginStage.objects.using(db_alias).first(), order=2,
    )


class Migration(migrations.Migration):

    dependencies = [
        ("passbook_flows", "0001_initial"),
        ("passbook_stages_user_login", "0001_initial"),
        ("passbook_stages_password", "0001_initial"),
        ("passbook_stages_identification", "0001_initial"),
    ]

    operations = [migrations.RunPython(create_default_flow)]