# app/auth/forms.py

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, SubmitField, SelectField, EmailField, HiddenField, TextAreaField
from wtforms.validators import DataRequired, Length, Email, EqualTo, Regexp, ValidationError, Optional
import re


def validate_phone(form, field):
    """اعتبارسنجی شماره موبایل ایران"""
    phone = field.data
    if not re.match(r'^09[0-9]{9}$', phone):
        raise ValidationError('شماره موبایل باید با 09 شروع و ۱۱ رقم باشد')


def validate_username(form, field):
    """اعتبارسنجی نام کاربری"""
    username = field.data
    if not re.match(r'^[a-zA-Z0-9_\u0600-\u06FF]{3,30}$', username):
        raise ValidationError('نام کاربری باید بین ۳ تا ۳۰ کاراکتر و شامل حروف، اعداد یا زیرخط باشد')


def validate_project_code(form, field):
    """اعتبارسنجی کد پروژه"""
    code = field.data
    if not re.match(r'^[0-9]{16}$', code):
        raise ValidationError('کد پروژه باید ۱۶ رقم باشد')


# ============================================
# فرم ورود با شماره تلفن
# ============================================

class AdvertisementLoginForm(FlaskForm):
    """فرم ورود به صفحه درخواست تبلیغ با شماره تلفن"""
    phone_number = StringField(
        'شماره تلفن',
        validators=[
            DataRequired(message='شماره تلفن را وارد کنید.'),
            Length(min=11, max=11, message='شماره تلفن باید ۱۱ رقم باشد.')
        ],
        render_kw={
            'placeholder': 'مثال: 09123456789',
            'class': 'form-control form-control-lg',
            'dir': 'ltr'
        }
    )
    otp_code = StringField(
        'کد تایید',
        validators=[
            Optional(),
            Length(min=6, max=6, message='کد تایید باید ۶ رقم باشد.')
        ],
        render_kw={
            'placeholder': 'کد ۶ رقمی',
            'class': 'form-control form-control-lg',
            'dir': 'ltr',
            'maxlength': '6',
            'pattern': '[0-9]{6}',
            'inputmode': 'numeric',
            'autocomplete': 'off'
        }
    )
    submit = SubmitField('ورود به صفحه درخواست تبلیغ')

# ============================================
# فرم‌های ورود
# ============================================

class AdminLoginForm(FlaskForm):
    """فرم ورود ادمین"""
    username = StringField('نام کاربری', validators=[
        DataRequired(message='نام کاربری الزامی است'),
        Length(min=3, max=30, message='نام کاربری باید بین ۳ تا ۳۰ کاراکتر باشد')
    ])
    password = PasswordField('رمز عبور', validators=[
        DataRequired(message='رمز عبور الزامی است')
    ])
    remember_me = BooleanField('مرا به خاطر بسپار')
    submit = SubmitField('ورود')


class ManagerLoginForm(FlaskForm):
    """فرم ورود مدیر پروژه"""
    username = StringField('نام کاربری', validators=[
        DataRequired(message='نام کاربری الزامی است'),
        Length(min=3, max=30, message='نام کاربری باید بین ۳ تا ۳۰ کاراکتر باشد')
    ])
    password = PasswordField('رمز عبور', validators=[
        DataRequired(message='رمز عبور الزامی است')
    ])
    remember_me = BooleanField('مرا به خاطر بسپار')
    submit = SubmitField('ورود')


# ============================================
# فرم‌های ورود کارفرما
# ============================================

class EmployerLoginStep1Form(FlaskForm):
    """مرحله اول ورود کارفرما"""
    project_code = StringField('کد ۱۶ رقمی پروژه', validators=[
        DataRequired(message='کد پروژه الزامی است'),
        validate_project_code
    ])
    phone = StringField('شماره موبایل', validators=[
        DataRequired(message='شماره موبایل الزامی است'),
        validate_phone
    ])
    submit = SubmitField('تایید و دریافت رمز موقت')


class EmployerLoginStep2Form(FlaskForm):
    """مرحله دوم ورود کارفرما - رمز موقت"""
    temp_password = PasswordField('رمز موقت', validators=[
        DataRequired(message='رمز موقت الزامی است'),
        Length(min=6, max=6, message='رمز موقت باید ۶ رقم باشد'),
        Regexp(r'^[0-9]{6}$', message='رمز موقت باید فقط شامل اعداد باشد')
    ])
    submit = SubmitField('ورود')


# ============================================
# فرم‌های ورود عوامل اجرایی (بدون QR Code)
# ============================================

class EmployeeLoginStep1Form(FlaskForm):
    """مرحله اول ورود عامل اجرایی - کد پروژه + شماره موبایل"""
    project_code = StringField('کد ۱۶ رقمی پروژه', validators=[
        DataRequired(message='کد پروژه الزامی است'),
        validate_project_code
    ])
    phone = StringField('شماره موبایل', validators=[
        DataRequired(message='شماره موبایل الزامی است'),
        validate_phone
    ])
    submit = SubmitField('تایید و دریافت رمز موقت')


class EmployeeLoginStep2Form(FlaskForm):
    """مرحله دوم ورود عامل اجرایی - رمز موقت + GPS"""
    temp_password = PasswordField('رمز موقت', validators=[
        DataRequired(message='رمز موقت الزامی است'),
        Length(min=6, max=6, message='رمز موقت باید ۶ رقم باشد'),
        Regexp(r'^[0-9]{6}$', message='رمز موقت باید فقط شامل اعداد باشد')
    ])
    lat = HiddenField('عرض جغرافیایی')
    lon = HiddenField('طول جغرافیایی')
    accuracy = HiddenField('دقت GPS')
    submit = SubmitField('تایید رمز و موقعیت GPS')


class EmployeeLoginStep3Form(FlaskForm):
    """مرحله سوم ورود عامل اجرایی - تشخیص چهره و ورود نهایی"""
    face_data = HiddenField('داده چهره')
    submit = SubmitField('تایید چهره و ورود')


# ============================================
# فرم ثبت نام مدیر پروژه
# ============================================

class ManagerRegisterForm(FlaskForm):
    """فرم ثبت نام مدیر پروژه"""
    username = StringField('نام کاربری', validators=[
        DataRequired(message='نام کاربری الزامی است'),
        validate_username
    ])
    fullname = StringField('نام و نام خانوادگی', validators=[
        DataRequired(message='نام و نام خانوادگی الزامی است'),
        Length(min=3, max=50, message='نام و نام خانوادگی باید بین ۳ تا ۵۰ کاراکتر باشد')
    ])
    phone = StringField('شماره موبایل', validators=[
        DataRequired(message='شماره موبایل الزامی است'),
        validate_phone
    ])
    email = EmailField('ایمیل', validators=[
        DataRequired(message='ایمیل الزامی است'),
        Email(message='ایمیل نامعتبر است')
    ])
    password = PasswordField('رمز عبور', validators=[
        DataRequired(message='رمز عبور الزامی است'),
        Length(min=6, message='رمز عبور باید حداقل ۶ کاراکتر باشد')
    ])
    confirm_password = PasswordField('تکرار رمز عبور', validators=[
        DataRequired(message='تکرار رمز عبور الزامی است'),
        EqualTo('password', message='رمز عبور و تکرار آن مطابقت ندارند')
    ])
    submit = SubmitField('ثبت نام')


# ============================================
# فرم تغییر رمز عبور
# ============================================

class ChangePasswordForm(FlaskForm):
    """فرم تغییر رمز عبور"""
    current_password = PasswordField('رمز عبور فعلی', validators=[
        DataRequired(message='رمز عبور فعلی الزامی است')
    ])
    new_password = PasswordField('رمز عبور جدید', validators=[
        DataRequired(message='رمز عبور جدید الزامی است'),
        Length(min=6, message='رمز عبور باید حداقل ۶ کاراکتر باشد')
    ])
    confirm_password = PasswordField('تکرار رمز عبور', validators=[
        DataRequired(message='تکرار رمز عبور الزامی است'),
        EqualTo('new_password', message='رمز عبور و تکرار آن مطابقت ندارند')
    ])
    submit = SubmitField('تغییر رمز عبور')


# ============================================
# فرم‌های API (بدون QR)
# ============================================

class GPSVerifyForm(FlaskForm):
    """فرم اعتبارسنجی GPS"""
    lat = StringField('عرض جغرافیایی', validators=[
        DataRequired(message='عرض جغرافیایی الزامی است'),
        Regexp(r'^-?\d+\.?\d*$', message='عرض جغرافیایی نامعتبر است')
    ])
    lon = StringField('طول جغرافیایی', validators=[
        DataRequired(message='طول جغرافیایی الزامی است'),
        Regexp(r'^-?\d+\.?\d*$', message='طول جغرافیایی نامعتبر است')
    ])
    accuracy = StringField('دقت GPS', validators=[
        Optional(),
        Regexp(r'^\d+\.?\d*$', message='دقت GPS نامعتبر است')
    ])
    submit = SubmitField('تایید GPS')


class FaceVerifyForm(FlaskForm):
    """فرم اعتبارسنجی چهره"""
    face_data = StringField('داده چهره', validators=[
        DataRequired(message='داده چهره الزامی است')
    ])
    submit = SubmitField('تایید چهره')


# ============================================
# فرم‌های کمکی
# ============================================

class ResendOTPForm(FlaskForm):
    """فرم ارسال مجدد رمز موقت"""
    phone = StringField('شماره موبایل', validators=[
        DataRequired(message='شماره موبایل الزامی است'),
        validate_phone
    ])
    submit = SubmitField('ارسال مجدد رمز موقت')


class VerifyOTPForm(FlaskForm):
    """فرم تایید رمز موقت"""
    temp_password = PasswordField('رمز موقت', validators=[
        DataRequired(message='رمز موقت الزامی است'),
        Length(min=6, max=6, message='رمز موقت باید ۶ رقم باشد'),
        Regexp(r'^[0-9]{6}$', message='رمز موقت باید فقط شامل اعداد باشد')
    ])
    submit = SubmitField('تایید')


class ProjectCodeForm(FlaskForm):
    """فرم تایید کد پروژه"""
    project_code = StringField('کد ۱۶ رقمی پروژه', validators=[
        DataRequired(message='کد پروژه الزامی است'),
        validate_project_code
    ])
    submit = SubmitField('تایید')