import nepali_datetime


def _resolve_submission_prefix(model_instance):
    if (
        hasattr(model_instance, "submission_type")
        and model_instance.submission_type
        and model_instance.submission_type.code_prefix
    ):
        return model_instance.submission_type.code_prefix

    model_name = model_instance.__class__.__name__
    prefixes = {
        "ImportSubmission": "IMP",
        "ExportSubmission": "EXP",
        "RevenueFineSubmission": "REV",
        "HealthInspectionSubmission": "INS",
        "DestructionSubmission": "DES",
    }
    return prefixes.get(model_name, "SUB")


def _next_sequence_for_prefix(field_name, search_prefix):
    # Use apps.get_model to avoid circular imports
    from django.apps import apps

    Submission = apps.get_model("record", "Submission")

    filter_lookup = {f"{field_name}__startswith": search_prefix}
    order_by = f"-{field_name}"
    last_record = Submission.objects.filter(**filter_lookup).order_by(order_by).first()

    if last_record:
        field_value = getattr(last_record, field_name, None)
        if field_value:
            try:
                return int(field_value.split("-")[-1]) + 1
            except (ValueError, IndexError):
                return 1
    return 1


def generate_tracking_code(model_instance):
    """
    Generates a tracking code in the format PREFIX-YYYY-NNN
    Example: IMP-2081-001
    """
    prefix = _resolve_submission_prefix(model_instance)

    # Get current Nepali Year (BS)
    now_bs = nepali_datetime.date.today()
    year_bs = now_bs.year

    # Prefix for filtering: e.g., "IMP-2081-"
    search_prefix = f"{prefix}-{year_bs}-"

    new_sequence = _next_sequence_for_prefix("tracking_code", search_prefix)

    return f"{prefix}-{year_bs}-{new_sequence:03d}"


def generate_reference_no(model_instance):
    """
    Generates a reference number in the format REF-PREFIX-YYYY-NNN
    Example: REF-IMP-2081-001
    """
    prefix = _resolve_submission_prefix(model_instance)

    now_bs = nepali_datetime.date.today()
    year_bs = now_bs.year

    search_prefix = f"REF-{prefix}-{year_bs}-"
    new_sequence = _next_sequence_for_prefix("refrence_no", search_prefix)

    return f"REF-{prefix}-{year_bs}-{new_sequence:03d}"
