from datetime import datetime

from human_resource.payroll_calculations import should_skip_deduction_title


def is_deduction_active(deduction, current_date=None) -> bool:
    if deduction is None or getattr(deduction, "recycle_bin", False):
        return False
    current_date = current_date or datetime.now().date()
    effective_to = getattr(deduction, "date_effective_to", None)
    effective_from = getattr(deduction, "date_effective_from", None)
    if effective_to and effective_to < current_date:
        return False
    if effective_from and effective_from > current_date:
        return False
    return True


def is_statutory_deduction_title(title: str) -> bool:
    from human_resource.payroll_calculations import _is_statutory_catalog_title
    return _is_statutory_catalog_title(title)


def staff_deduction_scheme_map(staff_deduction_scheme, current_date=None):
    deduction = staff_deduction_scheme.deduction
    if deduction is None or not is_deduction_active(deduction, current_date):
        return None
    if should_skip_deduction_title(deduction.deduction_title):
        return None

    scheme_module = str(staff_deduction_scheme.deduction_module or "").strip()
    scheme_value = str(staff_deduction_scheme.deduction_value or "").strip()
    effective_module = scheme_module or deduction.deduction_module
    effective_value = scheme_value or str(deduction.deduction_value or "0")

    return {
        "staff_deduction_scheme_id": str(staff_deduction_scheme.id),
        "deduction_id": str(deduction.id),
        "deduction_title": deduction.deduction_title,
        "deduction_description": deduction.deduction_description,
        "deduction_type": deduction.deduction_type,
        "deduction_module": effective_module,
        "deduction_value": effective_value,
        "scheme_deduction_module": scheme_module,
        "scheme_deduction_value": scheme_value,
    }
