from django import forms
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm, UsernameField, PasswordChangeForm, PasswordResetForm, SetPasswordForm, UserChangeForm
from django.contrib.auth import get_user_model
from django.contrib.auth.models import User
from django.contrib.auth import password_validation
from django.utils.translation import gettext_lazy as _
from .models import *
from django.core.exceptions import ValidationError
import re

BANGLA_TO_ENG_DIGIT = str.maketrans("০১২৩৪৫৬৭৮৯", "0123456789")

MyUser = get_user_model()

class CustomerRegistrationForm(forms.ModelForm):
    name = forms.CharField(label='আপনার নাম লিখুন', widget=forms.TextInput(attrs={'class': 'form-control'}))
    dob = forms.DateField(
        label='জন্মতারিখ', 
        widget=forms.DateInput(attrs={'class': 'form-control', 'type': 'date'}),
        required=True
    )
    mobile = forms.CharField(
        label='মোবাইল',
        widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'e.g. 01841040544'}),
    )
    role = forms.ChoiceField(
        choices=[('', '----------')] + [('Patient', 'রোগী'), ('Doctor', 'ডাক্তার')],
        widget=forms.Select(attrs={'class': 'form-control'}),
        required=True,
        label="আপনার ভূমিকা"
    )
    gender = forms.ChoiceField(
        choices=[('', '----------')] + [('Male', 'পুরুষ'), ('Female', 'মহিলা')],
        widget=forms.Select(attrs={'class': 'form-control'}),
        required=True,
        label="লিঙ্গ"
    )
    
    class Meta:
        model = get_user_model()
        fields = ['role', 'name', 'mobile', 'dob', 'gender']

    def clean_mobile(self):
        mobile = self.cleaned_data.get('mobile', '').translate(BANGLA_TO_ENG_DIGIT)
        if not re.fullmatch(r'\d{11}', mobile):
            raise ValidationError('মোবাইল নম্বর অবশ্যই ১১ সংখ্যার হতে হবে')
        return mobile


class LoginForm(AuthenticationForm):
    username = UsernameField(widget=forms.TextInput(attrs={'autofocus':True, 'class': 'form-control'}))

# class MyPasswordChangeForm(PasswordChangeForm):
#     old_password = forms.CharField(label=_("Old Password"), strip=False, widget=forms.PasswordInput(attrs={'autocomplete': 'current-password', 'autofocus': True, 'class': 'form-control'}))
#     new_password1 = forms.CharField(
#         label=_("New password"),
#         widget=forms.PasswordInput(attrs={"autocomplete": "new-password", 'class': 'form-control'}),
#         strip=False,
#         help_text=password_validation.password_validators_help_text_html(),
#     )
#     new_password2 = forms.CharField(
#         label=_("Confirm New Password"),
#         strip=False,
#         widget=forms.PasswordInput(attrs={"autocomplete": "new-password", 'class': 'form-control'}),
#     )

# class MyPasswordResetForm(PasswordResetForm):
#     email = forms.EmailField(
#         label=_("Email"),
#         max_length=254,
#         widget=forms.EmailInput(attrs={'autofocus':True, "autocomplete": "email", 'class': 'form-control'}),
#     )

# class MySetPasswordForm(SetPasswordForm):
#     new_password1 = forms.CharField(
#         label=_("New password"),
#         widget=forms.PasswordInput(attrs={'autofocus':True, "autocomplete": "new-password", 'class': 'form-control'}),
#         strip=False,
#         help_text=password_validation.password_validators_help_text_html(),
#     )
#     new_password2 = forms.CharField(
#         label=_("Confirm New Password"),
#         strip=False,
#         widget=forms.PasswordInput(attrs={"autocomplete": "new-password", 'class': 'form-control'}),
#     )

class CustomerProfileForm(forms.ModelForm):
    profile_pic = forms.ImageField(
        label="আপনার ছবি আপলোড করুন",
        required=False,
        widget=forms.ClearableFileInput(attrs={'class': 'form-control'}),
    )
    name = forms.CharField(label='আপনার নাম লিখুন', widget=forms.TextInput(attrs={'autofocus': True, 'class': 'form-control'}))
    dob = forms.DateField(
        label='জন্মতারিখ', 
        widget=forms.DateInput(attrs={'class': 'form-control', 'type': 'date'}),
        required=True
    )
    mobile = forms.CharField(
        label='মোবাইল',
        widget=forms.TextInput(attrs={'class': 'form-control'})
    )
    address = forms.CharField(
        label='ঠিকানা',
        widget=forms.Textarea(attrs={'class': 'form-control', 'rows': 3}),
        required=False, 
    )
    role = forms.ChoiceField(
        choices=[('', '----------')] + [('Patient', 'রোগী'), ('Doctor', 'ডাক্তার')],
        widget=forms.Select(attrs={'class': 'form-control'}),
        required=False,
        label="আপনার ভূমিকা"
    )
    gender = forms.ChoiceField(
        choices=[('', '----------')] + [('Male', 'পুরুষ'), ('Female', 'মহিলা')],
        widget=forms.Select(attrs={'class': 'form-control'}),
        required=False,
        label="লিঙ্গ"
    )
    class Meta:
        model = get_user_model()
        fields = ['profile_pic', 'name', 'mobile', 'dob',  'role', 'address']

class DoctorForm(forms.ModelForm):
    class Meta:
        model = Doctor
        fields = "__all__"

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # Order vendors by latest first
        self.fields['vendor'].queryset = MyUser.objects.all().order_by('-id')

class AppointmentForm(forms.ModelForm):
    class Meta:
        model = Appointment
        fields = "__all__"

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # Order vendors by latest first
        self.fields['doctor'].queryset = Doctor.objects.all().order_by('-id')
        self.fields['patient'].queryset = MyUser.objects.all().order_by('-id')
        self.fields['available'].queryset = Availability.objects.all().order_by('-id')


class PatientUpdateForm(forms.ModelForm):

    class Meta:
        model = MyUser
        fields = [
            'name',
            'dob',
            'gender',
        ]

        widgets = {
            'name': forms.TextInput(attrs={
                'class': 'form-control'
            }),

            'dob': forms.DateInput(attrs={
                'class': 'form-control',
                'type': 'date'
            }),

            'gender': forms.Select(attrs={
                'class': 'form-control'
            }),

        }