# from django.contrib.auth import get_user_model
# from django.db import transaction

# User = get_user_model()

# mobile = "7676669993"  # <-- change

# def _blank_or_none(model, field_name):
#     f = model._meta.get_field(field_name)
#     return None if getattr(f, "null", False) else ""

# with transaction.atomic():
#     u = User.objects.select_for_update().get(mobile_number=mobile)
#     u.state   = _blank_or_none(User, "state")
#     u.district= _blank_or_none(User, "district")
#     u.city    = _blank_or_none(User, "city")
#     u.pincode = _blank_or_none(User, "pincode")
#     u.save(update_fields=["state","district","city","pincode"])

# # verify
# User.objects.filter(mobile_number=mobile).values("mobile_number","state","district","city","pincode")



# from django.contrib.auth import get_user_model
# from django.db import transaction

# User = get_user_model()

# mobiles = ["8096248999", "9000000007"]  # <-- change

# def _blank_or_none(model, field):
#     return None if model._meta.get_field(field).null else ""

# vals = {
#     "state":   _blank_or_none(User, "state"),
#     "district":_blank_or_none(User, "district"),
#     "city":    _blank_or_none(User, "city"),
#     "pincode": _blank_or_none(User, "pincode"),
# }

# with transaction.atomic():
#     User.objects.filter(mobile_number__in=mobiles).update(**vals)

# # quick check
# list(User.objects.filter(mobile_number__in=mobiles).values("mobile_number","state","district","city","pincode"))









from typing import Iterable, Union, List, Dict, Sequence
from django.contrib.auth import get_user_model
from django.db import transaction

User = get_user_model()

def _blank_or_none(model, field: str):
    f = model._meta.get_field(field)
    return None if getattr(f, "null", False) else ""

def clear_user_location(
    mobiles: Union[str, Iterable[str]],
    *,
    fields: Sequence[str] = ("state", "district", "city", "pincode"),
    lock_single: bool = False,
) -> List[Dict[str, str]]:
    """
    Clears the given `fields` for the user(s) matching the mobile numbers and returns
    the updated rows (mobile_number + those fields).
    """
    mobile_list = [mobiles] if isinstance(mobiles, str) else list(mobiles)
    if not mobile_list:
        return []

    vals = {f: _blank_or_none(User, f) for f in fields}

    with transaction.atomic():
        if lock_single and len(mobile_list) == 1:
            u = User.objects.select_for_update().get(mobile_number=mobile_list[0])
            for f, v in vals.items():
                setattr(u, f, v)
            u.save(update_fields=list(vals.keys()))
        else:
            User.objects.filter(mobile_number__in=mobile_list).update(**vals)

    # ⬇️ fetch AFTER the transaction; and make sure we RETURN it
    return list(
        User.objects.filter(mobile_number__in=mobile_list)
        .values("mobile_number", *fields)
    )


# Usage
# Single (with row lock)
# res1 = clear_user_location("7676669993", lock_single=True)
# print(res1)

# # Multiple
# mobiles = ["8096248999", "9995830786","9966888883","7676669993"]
# res2 = clear_user_location(mobiles)
# print(res2)
# print(len(res2), "rows")    # verify count

# # If you only want to clear pincode
# res3 = clear_user_location("9000000007", fields=("pincode",))
# print(res3)


