import re
from django import forms
from django.core.exceptions import ValidationError
from captcha.fields import CaptchaField

MOBILE_REGEX = r'^09\d{9}$'

class RegisterForm(forms.Form):
    email = forms.EmailField(
        label='ایمیل (اختیاری)',
        required=False,
        widget=forms.EmailInput(attrs={'class': 'form-control', 'placeholder': 'ایمیل'})
    )
    mobile = forms.CharField(
        label='شماره موبایل (اختیاری)',
        required=False,
        max_length=11,
        widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': '09123456789'})
    )
    password = forms.CharField(
        label='کلمه عبور',
        min_length=6,
        widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'کلمه عبور'})
    )
    confirm_password = forms.CharField(
        label='تکرار کلمه عبور',
        min_length=6,
        widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'تکرار کلمه عبور'})
    )
    captcha = CaptchaField(label='کد امنیتی')

    def clean_mobile(self):
        mobile = (self.cleaned_data.get('mobile') or '').strip()
        if mobile and not re.match(MOBILE_REGEX, mobile):
            raise forms.ValidationError('فرمت شماره موبایل صحیح نیست (باید با 09 شروع شود).')
        return mobile

    def clean(self):
        cleaned_data = super().clean()
        email = cleaned_data.get('email')
        mobile = cleaned_data.get('mobile')
        password = cleaned_data.get('password')
        confirm_password = cleaned_data.get('confirm_password')

        if not email and not mobile:
            raise ValidationError("وارد کردن حداقل یکی از موارد (ایمیل یا شماره موبایل) الزامی است.")

        if password and confirm_password and password != confirm_password:
            self.add_error('confirm_password', 'کلمه عبور و تکرار آن یکسان نیستند.')
        return cleaned_data


class LoginForm(forms.Form):
    identifier = forms.CharField(label="ایمیل یا موبایل")
    password = forms.CharField(label="کلمه عبور", widget=forms.PasswordInput, required=False) # قبلاً این را False کرده بودیم

    def clean(self):
        cleaned_data = super().clean()
        identifier = cleaned_data.get('identifier')
        password = cleaned_data.get('password')

        # تشخیص موبایل
        is_mobile = re.match(r'^09\d{9}$', identifier)

        # اگر موبایل است، نیازی به رمز عبور نیست
        if is_mobile:
            return cleaned_data
        
        # اگر موبایل نیست (یعنی ایمیل است)، رمز عبور اجباری است
        if not password:
            self.add_error('password', 'وارد کردن رمز عبور برای ورود با ایمیل الزامی است.')
            
        return cleaned_data


class OTPVerificationForm(forms.Form):
    """فرم جدید برای تایید کد پیامکی"""
    otp_code = forms.CharField(
        label='کد تایید پیامکی',
        max_length=5,
        widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'کد ۵ رقمی ارسالی'})
    )


class ForgetPasswordForm(forms.Form):
    identifier = forms.CharField(
        label='ایمیل یا شماره موبایل',
        required=True,
        widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'ایمیل یا موبایل'})
    )

    def clean_identifier(self):
        identifier = (self.cleaned_data.get('identifier') or '').strip()
        if "@" not in identifier and not re.match(MOBILE_REGEX, identifier):
            raise forms.ValidationError('ایمیل یا شماره موبایل وارد شده معتبر نیست.')
        return identifier


class ResetPasswordForm(forms.Form):
    password = forms.CharField(
        label='کلمه عبور جدید',
        min_length=6,
        widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'کلمه عبور جدید'})
    )
    confirm_password = forms.CharField(
        label='تکرار کلمه عبور',
        min_length=6,
        widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'تکرار کلمه عبور'})
    )
    captcha = CaptchaField(label='کد امنیتی')

    def clean(self):
        cleaned_data = super().clean()
        password = cleaned_data.get('password')
        confirm_password = cleaned_data.get('confirm_password')
        if password and confirm_password and password != confirm_password:
            self.add_error('confirm_password', 'کلمه عبور و تکرار آن یکسان نیستند.')
        return cleaned_data
