from typing import Dict
from django.contrib.auth import get_user_model
from django.contrib.auth.hashers import check_password
from rest_framework_simplejwt.tokens import RefreshToken
from apps.accounts.models import Occupation

# from apps.accounts.models import User
from apps.business.geo.models import Pincode  # adjust if path differs


User = get_user_model()


def login_user(data: Dict) -> Dict:
    mobile = data.get('mobile_number')
    pin = data.get('login_pin')

    if not mobile or not pin:
        return {'ok': False, 'error': 'Mobile number and PIN are required'}

    try:
        user = User.objects.get(mobile=mobile)
    except User.DoesNotExist:
        return {'ok': False, 'error': 'User not found'}

    # 🔐 IMPORTANT: use hashed PIN (recommended)
    if not user.check_login_pin(pin):
        return {'ok': False, 'error': 'Invalid PIN'}

    # Generate JWT tokens
    refresh = RefreshToken.for_user(user)
    access_token = str(refresh.access_token)
    refresh_token = str(refresh)

    return {
        'ok': True,
        'data': {
            'access_token': access_token,
            'refresh_token': refresh_token,
            'role': user.role,
            'must_change_login_pin': bool(getattr(user, 'must_change_login_pin', False)),
            'user': {
                'id': str(user.id),
                'mobile_number': user.mobile,
                'email': user.email,
                'is_staff': user.is_staff,
                'role': user.role,
                'must_change_login_pin': bool(getattr(user, 'must_change_login_pin', False)),
            }
        }
    }

def register_user(data: Dict) -> Dict:
    mobile = data.get('mobile_number')
    pin = data.get('login_pin')

    if not mobile or not pin:
        return {'ok': False, 'error': 'Mobile number and PIN are required'}

    if User.objects.filter(mobile=mobile).exists():
        return {'ok': False, 'error': 'User already exists'}

    # 🔹 Handle pincode FK
    pincode_obj = None
    pincode_val = data.get('pincode')
    if pincode_val:
        pincode_obj = Pincode.objects.filter(code=pincode_val).first()

    # 🔹 Handle referral (sponsor_code)
    referred_by = None
    sponsor_code = data.get('sponsor_code')
    if sponsor_code:
        referred_by = User.objects.filter(referral_code=sponsor_code).first()

    occupation_obj = None
    occupation_val = data.get('occupation')
    if occupation_val:
        if isinstance(occupation_val, int):
            occupation_obj = Occupation.objects.filter(id=occupation_val).first()
        elif isinstance(occupation_val, str):
            occupation_obj = Occupation.objects.filter(name__iexact=occupation_val).first()

    user = User.objects.create_mobile_user(
        mobile=mobile,
        login_pin=pin,
        first_name=data.get('first_name'),
        last_name=data.get('last_name'),
        email=data.get('email'),
        pan_number=data.get('pan_number'),
        date_of_birth=data.get('date_of_birth'),
        occupation=occupation_obj,
        pincode=pincode_obj,
        referred_by=referred_by,
        accept_terms=data.get('terms_accepted', False)
    )

    return {
        'ok': True,
        'data': {
            'user': {
                'id': user.id,
                'mobile_number': user.mobile,
                'must_change_login_pin': bool(getattr(user, 'must_change_login_pin', False)),
            }
        }
    }