from apps.geo.models import FranchiseAssignment, StoreTransferLedger


def resolve_assignment_for_user(user):
    """Resolve best-fit active assignment by user pincode geography: mandal -> district -> state."""
    pincode = getattr(user, 'pincode', None)
    if not pincode:
        return None

    mandal = None
    district = getattr(pincode, 'district', None)
    state = getattr(pincode, 'state', None)

    if district:
        mandal = district.mandals.filter(is_active=True).first()

    if mandal:
        assignment = FranchiseAssignment.objects.filter(
            is_active=True,
            territory_level=FranchiseAssignment.TerritoryLevel.MANDAL,
            mandal=mandal,
        ).select_related('store', 'user').first()
        if assignment:
            return assignment

    if district:
        assignment = FranchiseAssignment.objects.filter(
            is_active=True,
            territory_level=FranchiseAssignment.TerritoryLevel.DISTRICT,
            district=district,
        ).select_related('store', 'user').first()
        if assignment:
            return assignment

    if state:
        assignment = FranchiseAssignment.objects.filter(
            is_active=True,
            territory_level=FranchiseAssignment.TerritoryLevel.STATE,
            state=state,
        ).select_related('store', 'user').first()
        if assignment:
            return assignment

    return None


def create_company_to_store_transfer(order, assignment=None):
    if not assignment or not assignment.store:
        return None

    return StoreTransferLedger.objects.create(
        order=order,
        store=assignment.store,
        transfer_type=StoreTransferLedger.TransferType.COMPANY_TO_STORE,
        transfer_status=StoreTransferLedger.TransferStatus.INITIATED,
        quantity=1,
        remarks='Auto-created on purchase confirmation.',
        performed_by=assignment.assigned_by,
    )
