"""admin_assignment 任职 CRUD（修复停用不生效、重复插入）。"""
from django.db.models import Q
from django.utils import timezone

from jituan.constants import DATA_SCOPE_ALL, DATA_SCOPE_SINGLE
from jituan.models import AdminAssignment


def _club_filter(qs, club_id):
    if club_id is None:
        return qs.filter(Q(club_id__isnull=True) | Q(club_id=''))
    return qs.filter(club_id=club_id)


def find_assignment(yonghuid, club_id, role_code):
    qs = AdminAssignment.query.filter(yonghuid=yonghuid, role_code=role_code)
    return _club_filter(qs, club_id).first()


def find_active_assignment(yonghuid, club_id, role_code):
    qs = AdminAssignment.query.filter(yonghuid=yonghuid, role_code=role_code, status=1)
    return _club_filter(qs, club_id).first()


def clear_other_primary_assignments(yonghuid, except_id=None):
    qs = AdminAssignment.query.filter(yonghuid=yonghuid, status=1, is_primary=True)
    if except_id:
        qs = qs.exclude(id=except_id)
    ids = list(qs.values_list('id', flat=True))
    if ids:
        AdminAssignment.objects.filter(pk__in=ids).update(
            is_primary=False,
            UpdateTime=timezone.now(),
        )


def _clear_other_primary(yonghuid, except_id=None):
    clear_other_primary_assignments(yonghuid, except_id=except_id)


def create_or_reactivate_assignment(
    yonghuid,
    club_id,
    role_code,
    data_scope,
    is_primary,
    granted_by,
):
    active = find_active_assignment(yonghuid, club_id, role_code)
    if active:
        return None, '该任职记录已存在且有效'

    if is_primary:
        _clear_other_primary(yonghuid)

    inactive = find_assignment(yonghuid, club_id, role_code)
    if inactive and inactive.status != 1:
        if is_primary:
            _clear_other_primary(yonghuid)
        AdminAssignment.objects.filter(pk=inactive.id).update(
            status=1,
            data_scope=data_scope,
            is_primary=is_primary,
            granted_by=granted_by,
            UpdateTime=timezone.now(),
        )
        return inactive.id, None

    row = AdminAssignment.query.create(
        yonghuid=yonghuid,
        club_id=club_id,
        role_code=role_code,
        data_scope=data_scope,
        is_primary=is_primary,
        granted_by=granted_by,
        status=1,
    )
    return row.id, None


def deactivate_assignment(assignment_id):
    try:
        pk = int(assignment_id)
    except (TypeError, ValueError):
        return False, '任职 id 无效'

    updated = AdminAssignment.objects.filter(pk=pk, status=1).update(
        status=0,
        UpdateTime=timezone.now(),
    )
    if updated:
        return True, None

    exists = AdminAssignment.objects.filter(pk=pk).exists()
    if exists:
        return True, None
    return False, '任职记录不存在'


def dedupe_active_assignments():
    """停用重复的有效任职，每组 (yonghuid, club_id, role_code) 只保留一条。"""
    rows = list(
        AdminAssignment.query.filter(status=1).order_by('yonghuid', 'club_id', 'role_code', 'id')
    )
    seen = {}
    dup_ids = []
    for row in rows:
        key = (row.yonghuid, row.club_id or '', row.role_code)
        if key in seen:
            dup_ids.append(row.id)
        else:
            seen[key] = row.id
    if dup_ids:
        AdminAssignment.objects.filter(pk__in=dup_ids).update(
            status=0,
            UpdateTime=timezone.now(),
        )
    return len(dup_ids)
