from django.contrib.auth.models import Group, Permission
from django.core.management.base import BaseCommand

from apps.usuarios.permissions import ADMIN_GROUP_NAME


class Command(BaseCommand):
    help = "Crea roles (grupos) base y asigna permisos."

    def handle(self, *args, **options):
        admin_group, _ = Group.objects.get_or_create(name=ADMIN_GROUP_NAME)
        pesador_group, _ = Group.objects.get_or_create(name="Pesador")
        financiera_group, _ = Group.objects.get_or_create(name="Financiera")
        molino_group, _ = Group.objects.get_or_create(name="Molino")
        operador_bodega_group, _ = Group.objects.get_or_create(name="OperadorBodega")
        supervisor_group, _ = Group.objects.get_or_create(name="Supervisor")
        catalogos_group, _ = Group.objects.get_or_create(name="Catalogos")
        boletas_group, _ = Group.objects.get_or_create(name="Boletas")
        recepciones_group, _ = Group.objects.get_or_create(name="Recepciones")
        expediente_group, _ = Group.objects.get_or_create(name="Expediente")
        tecnicos_group, _ = Group.objects.get_or_create(name="Técnicos")
        laboratoristas_group, _ = Group.objects.get_or_create(name="Laboratoristas")
        productor_group, _ = Group.objects.get_or_create(name="Productor")
        calidad_group, _ = Group.objects.get_or_create(name="Calidad")
        externo_group, _ = Group.objects.get_or_create(name="Externo")
        operador_financiero_group, _ = Group.objects.get_or_create(name="Operador Financiero")
        supervisor_molino_group, _ = Group.objects.get_or_create(name="Supervisor Molino")

        perms_catalogos = list(
            Permission.objects.filter(
                codename__in=["create", "edit", "delete"], content_type__app_label="catalogos"
            )
        )
        perms_boletas = list(
            Permission.objects.filter(
                codename__in=["create", "generate", "edit", "delete"],
                content_type__app_label="boletas",
            )
        )
        perms_boletas_view = list(
            Permission.objects.filter(
                codename="view_boleta", content_type__app_label="boletas"
            )
        )
        perms_boletas_operador_financiero = list(
            Permission.objects.filter(
                codename__in=["create", "generate"],
                content_type__app_label="boletas",
            )
        )

        perms_bodegas = list(
            Permission.objects.filter(
                codename__in=["manage_bodegas"],
                content_type__app_label="catalogos",
            )
        )

        perms_recepciones = list(
            Permission.objects.filter(
                codename__in=["create", "edit", "process", "close"],
                content_type__app_label="recepciones",
            )
        )
        perms_recepciones_view = list(
            Permission.objects.filter(
                codename="view_recepcion", content_type__app_label="recepciones"
            )
        )
        perms_recepciones_create = list(
            Permission.objects.filter(
                codename="create", content_type__app_label="recepciones"
            )
        )

        perms_recepciones_externo = list(
            Permission.objects.filter(
                codename__in=["create", "process"],
                content_type__app_label="recepciones",
            )
        )

        perms_recepciones_validacion = list(
            Permission.objects.filter(
                codename__in=["validate", "reopen", "resolve_dispute"],
                content_type__app_label="recepciones",
            )
        )
        perms_recepciones_validate = list(
            Permission.objects.filter(
                codename="validate", content_type__app_label="recepciones"
            )
        )

        perms_muestreo_laboratorio = list(
            Permission.objects.filter(content_type__app_label="muestreo_laboratorio")
        )
        perms_muestreo_laboratorio_view = list(
            Permission.objects.filter(
                content_type__app_label="muestreo_laboratorio",
                codename__startswith="view_",
            )
        )

        perms_calidad_catalogos = list(
            Permission.objects.filter(
                codename__in=["manage_calidad_catalogos"],
                content_type__app_label="catalogos",
            )
        )
        permisos_actuales_calidad = list(calidad_group.permissions.all())
        permisos_base_calidad = permisos_actuales_calidad + perms_muestreo_laboratorio + perms_calidad_catalogos
        tipos_con_acceso_calidad = {perm.content_type_id for perm in permisos_base_calidad}
        permisos_edicion_calidad = [
            perm
            for perm in Permission.objects.filter(content_type_id__in=tipos_con_acceso_calidad)
            if perm.codename in {"create", "edit"}
            or perm.codename.startswith("add_")
            or perm.codename.startswith("change_")
        ]

        perms_expediente = list(
            Permission.objects.filter(
                content_type__app_label="expediente",
                codename__in=["view", "enviar_erp", "reabrir_boleta", "resolver_disputa"],
            )
        )

        perms_expediente_view = list(
            Permission.objects.filter(content_type__app_label="expediente", codename__in=["view"])
        )

        perms_traspasos_operador = list(
            Permission.objects.filter(
                content_type__app_label="traspasos",
                codename__in=["add_traspaso", "change_traspaso", "view_traspaso"],
            )
        )
        perms_traspasos_view = list(
            Permission.objects.filter(
                content_type__app_label="traspasos",
                codename="view_traspaso",
            )
        )
        perms_traspasos_create_view = list(
            Permission.objects.filter(
                content_type__app_label="traspasos",
                codename__in=["add_traspaso", "view_traspaso"],
            )
        )
        perms_traspasos_supervisor = list(
            Permission.objects.filter(
                content_type__app_label="traspasos",
                codename__in=[
                    "add_traspaso",
                    "change_traspaso",
                    "view_traspaso",
                    "aceptar_con_diferencia",
                    "registrar_ajuste",
                    "abrir_disputa",
                ],
            )
        )

        perms_muestreo_tecnicos = list(
            Permission.objects.filter(
                content_type__app_label="muestreo_laboratorio",
                codename__in=[
                    "add_tomamuestra",
                    "change_tomamuestra",
                    "view_tomamuestra",
                    "add_fotomuestra",
                    "change_fotomuestra",
                    "view_fotomuestra",
                ],
            )
        )

        catalogos_group.permissions.set(perms_catalogos)
        boletas_group.permissions.set(perms_boletas + perms_boletas_view)
        recepciones_group.permissions.set(perms_recepciones + perms_recepciones_view)
        expediente_group.permissions.set(perms_expediente)
        tecnicos_group.permissions.set(
            perms_muestreo_tecnicos
            + perms_muestreo_laboratorio_view
            + perms_boletas_view
            + perms_recepciones_view
            + perms_recepciones_create
            + perms_traspasos_create_view
        )
        laboratoristas_group.permissions.set(perms_muestreo_laboratorio)
        operador_bodega_group.permissions.set(perms_traspasos_operador)
        supervisor_group.permissions.set(perms_traspasos_supervisor)

        pesador_group.permissions.set(
            perms_recepciones + perms_recepciones_view + perms_traspasos_operador
        )
        financiera_group.permissions.set(
            perms_catalogos
            + perms_boletas
            + perms_boletas_view
            + perms_expediente_view
            + perms_recepciones_view
            + perms_traspasos_view
            + perms_muestreo_laboratorio_view
        )
        operador_financiero_group.permissions.set(
            perms_boletas_operador_financiero
            + perms_boletas_view
            + perms_recepciones_view
            + perms_traspasos_view
        )
        molino_group.permissions.set(
            perms_catalogos
            + perms_bodegas
            + perms_boletas_view
            + perms_expediente_view
            + perms_recepciones_view
            + perms_recepciones_validate
            + perms_traspasos_view
        )
        supervisor_molino_group.permissions.set(
            perms_catalogos
            + perms_bodegas
            + perms_boletas_view
            + perms_recepciones_view
            + perms_recepciones_validacion
            + perms_traspasos_view
        )

        productor_group.permissions.set([])
        externo_group.permissions.set(
            perms_recepciones_externo
            + perms_recepciones_view
            + perms_traspasos_create_view
            + perms_muestreo_laboratorio_view
        )
        calidad_group.permissions.set(
            permisos_base_calidad + permisos_edicion_calidad + perms_recepciones_view
        )
        admin_group.permissions.set(Permission.objects.all())

        self.stdout.write(self.style.SUCCESS("Roles/permisos bootstrap completado."))
