# app/public/forms.py - اضافه کردن فرم‌های جدید جستجو

from flask_wtf import FlaskForm
from wtforms import (
    StringField, TextAreaField, FileField, SubmitField, SelectField, 
    IntegerField, FloatField, EmailField, TelField, PasswordField, 
    BooleanField, HiddenField, DateTimeField, DateField
)
from wtforms.validators import (
    DataRequired, Email, Length, Optional, NumberRange, 
    Regexp, EqualTo, ValidationError, URL
)
from flask_wtf.file import FileAllowed, FileRequired
from datetime import datetime
from flask_wtf.file import FileField, FileAllowed, FileRequired
from wtforms import StringField, TextAreaField, SelectField, DecimalField, IntegerField
from wtforms.validators import DataRequired, Length, NumberRange, Optional


# ============================================
# بخش 1: فرم‌های عمومی
# ============================================

class ContactForm(FlaskForm):
    """فرم تماس با ما"""
    name = StringField(
        'نام و نام خانوادگی', 
        validators=[DataRequired(), Length(min=3, max=100)],
        render_kw={"placeholder": "نام و نام خانوادگی خود را وارد کنید"}
    )
    email = EmailField(
        'ایمیل', 
        validators=[DataRequired(), Email(), Length(max=100)],
        render_kw={"placeholder": "ایمیل خود را وارد کنید"}
    )
    phone = TelField(
        'شماره تماس', 
        validators=[Optional(), Regexp('^09[0-9]{9}$', message='شماره موبایل معتبر نیست')],
        render_kw={"placeholder": "شماره موبایل (اختیاری)"}
    )
    subject = StringField(
        'موضوع', 
        validators=[Optional(), Length(max=200)],
        render_kw={"placeholder": "موضوع پیام"}
    )
    message = TextAreaField(
        'متن پیام', 
        validators=[DataRequired(), Length(min=10, max=1000)],
        render_kw={"placeholder": "متن پیام خود را وارد کنید...", "rows": 5}
    )
    submit = SubmitField('ارسال پیام')


class QuickContactForm(FlaskForm):
    """فرم تماس سریع در فوتر"""
    name = StringField(
        'نام', 
        validators=[DataRequired(), Length(max=100)],
        render_kw={"placeholder": "نام شما"}
    )
    email = EmailField(
        'ایمیل', 
        validators=[DataRequired(), Email()],
        render_kw={"placeholder": "ایمیل شما"}
    )
    message = TextAreaField(
        'پیام', 
        validators=[DataRequired(), Length(max=500)],
        render_kw={"placeholder": "پیام شما...", "rows": 3}
    )
    submit = SubmitField('ارسال')


class NewsletterForm(FlaskForm):
    """فرم عضویت در خبرنامه"""
    email = EmailField(
        'ایمیل', 
        validators=[DataRequired(), Email()],
        render_kw={"placeholder": "ایمیل خود را وارد کنید"}
    )
    submit = SubmitField('عضویت')

# app/public/forms.py

from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileAllowed
from wtforms import StringField, TextAreaField, SelectField, DecimalField, IntegerField, EmailField, SubmitField
from wtforms.validators import DataRequired, Length, NumberRange, Email, Optional, URL
from datetime import datetime


class AdvertisementRequestForm(FlaskForm):
    """فرم درخواست تبلیغ (بدون فیلد position)"""
    
    title = StringField(
        'عنوان تبلیغ',
        validators=[DataRequired(message='عنوان تبلیغ را وارد کنید.'), 
                   Length(min=3, max=100, message='عنوان باید بین ۳ تا ۱۰۰ کاراکتر باشد.')],
        render_kw={'placeholder': 'عنوان تبلیغ خود را وارد کنید', 'class': 'form-control'}
    )
    
    description = TextAreaField(
        'توضیحات',
        validators=[DataRequired(message='توضیحات را وارد کنید.'), 
                   Length(min=10, max=1000, message='توضیحات باید بین ۱۰ تا ۱۰۰۰ کاراکتر باشد.')],
        render_kw={'rows': 5, 'placeholder': 'توضیحات کامل تبلیغ ...', 'class': 'form-control'}
    )
    
    price = DecimalField(
        'قیمت (تومان)',
        validators=[DataRequired(message='قیمت را وارد کنید.'), 
                   NumberRange(min=0, message='قیمت باید مثبت باشد.')],
        render_kw={'placeholder': 'مثلاً ۵۰۰۰۰۰', 'class': 'form-control'}
    )
    
    duration_days = IntegerField(
        'مدت (روز)',
        validators=[DataRequired(message='مدت را وارد کنید.'), 
                   NumberRange(min=1, max=365, message='مدت باید بین ۱ تا ۳۶۵ روز باشد.')],
        render_kw={'placeholder': 'مثلاً ۳۰', 'class': 'form-control'}
    )
    
    image = FileField(
        'تصویر تبلیغ',
        validators=[
            Optional(),
            FileAllowed(['jpg', 'jpeg', 'png', 'gif', 'webp'], 
                       'فقط فرمت‌های JPG, PNG, GIF و WEBP مجاز هستند.'),
        ],
        render_kw={'accept': 'image/*', 'class': 'form-control'}
    )
    
    target_url = StringField(
        'لینک هدف (اختیاری)',
        validators=[Optional(), URL(message='لینک معتبر وارد کنید.')],
        render_kw={'placeholder': 'https://example.com', 'class': 'form-control'}
    )
    
    advertiser_name = StringField(
        'نام تبلیغ‌دهنده (اختیاری)',
        validators=[Optional(), Length(max=100)],
        render_kw={'placeholder': 'نام کامل', 'class': 'form-control'}
    )
    
    advertiser_phone = StringField(
        'شماره تماس (اختیاری)',
        validators=[Optional(), Length(min=11, max=11, message='شماره تلفن باید ۱۱ رقم باشد.')],
        render_kw={'placeholder': '09123456789', 'class': 'form-control'}
    )
    
    advertiser_email = EmailField(
        'ایمیل (اختیاری)',
        validators=[Optional(), Email(message='ایمیل معتبر وارد کنید.')],
        render_kw={'placeholder': 'example@email.com', 'class': 'form-control'}
    )
    
    submit = SubmitField('ارسال درخواست')


class AdvertisementApproveForm(FlaskForm):
    """فرم تایید تبلیغات توسط ادمین"""
    status = SelectField(
        'وضعیت', 
        choices=[
            ('approved', 'تایید و فعالسازی'),
            ('rejected', 'رد درخواست')
        ], 
        validators=[DataRequired()]
    )
    admin_note = TextAreaField(
        'توضیحات', 
        validators=[Optional(), Length(max=500)],
        render_kw={"placeholder": "توضیحات برای تبلیغ‌دهنده...", "rows": 3}
    )
    submit = SubmitField('ثبت وضعیت')


# ============================================
# بخش 3: فرم‌های جستجو
# ============================================

class ProjectSearchForm(FlaskForm):
    """فرم جستجوی پروژه"""
    query = StringField(
        'جستجو', 
        validators=[Optional(), Length(max=100)],
        render_kw={"placeholder": "جستجوی پروژه..."}
    )
    status = SelectField(
        'وضعیت', 
        choices=[
            ('', 'همه'),
            ('active', 'فعال'),
            ('completed', 'تکمیل شده'),
            ('suspended', 'متوقف')
        ], 
        validators=[Optional()]
    )
    submit = SubmitField('جستجو')


class ManagerSearchForm(FlaskForm):
    """فرم جستجوی مدیران"""
    query = StringField(
        'جستجو', 
        validators=[Optional(), Length(max=100)],
        render_kw={"placeholder": "جستجوی مدیران..."}
    )
    status = SelectField(
        'وضعیت', 
        choices=[
            ('', 'همه'),
            ('pending', 'در انتظار تایید'),
            ('approved', 'تایید شده'),
            ('rejected', 'رد شده')
        ], 
        validators=[Optional()]
    )
    submit = SubmitField('جستجو')


class EmployerSearchForm(FlaskForm):
    """فرم جستجوی کارفرمایان"""
    query = StringField(
        'جستجو', 
        validators=[Optional(), Length(max=100)],
        render_kw={"placeholder": "جستجوی کارفرمایان..."}
    )
    status = SelectField(
        'وضعیت', 
        choices=[
            ('', 'همه'),
            ('active', 'فعال'),
            ('inactive', 'غیرفعال')
        ], 
        validators=[Optional()]
    )
    submit = SubmitField('جستجو')


class EmployeeSearchForm(FlaskForm):
    """فرم جستجوی کارکنان"""
    query = StringField(
        'جستجو', 
        validators=[Optional(), Length(max=100)],
        render_kw={"placeholder": "جستجوی کارکنان..."}
    )
    role = SelectField(
        'نقش در پروژه', 
        choices=[
            ('', 'همه نقش‌ها'),
            ('مهندس مجری', 'مهندس مجری'),
            ('مهندس ناظر', 'مهندس ناظر'),
            ('تکنسین', 'تکنسین'),
            ('کارگر ماهر', 'کارگر ماهر'),
            ('کارگر ساده', 'کارگر ساده'),
            ('راننده', 'راننده')
        ], 
        validators=[Optional()]
    )
    project = SelectField(
        'پروژه', 
        choices=[('', 'همه پروژه‌ها')],
        validators=[Optional()]
    )
    submit = SubmitField('جستجو')


class UserSearchForm(FlaskForm):
    """فرم جستجوی کاربران"""
    query = StringField(
        'جستجو', 
        validators=[Optional(), Length(max=100)],
        render_kw={"placeholder": "نام، شماره تماس یا کد ملی..."}
    )
    role = SelectField(
        'نقش', 
        choices=[
            ('', 'همه'),
            ('admin', 'ادمین'),
            ('manager', 'مدیر پروژه'),
            ('employer', 'کارفرما'),
            ('employee', 'عامل اجرایی')
        ], 
        validators=[Optional()]
    )
    status = SelectField(
        'وضعیت', 
        choices=[
            ('', 'همه'),
            ('active', 'فعال'),
            ('inactive', 'غیرفعال')
        ], 
        validators=[Optional()]
    )
    submit = SubmitField('جستجو')


# ============================================
# بخش 4: فرم‌های پروفایل کاربر
# ============================================

class ProfileForm(FlaskForm):
    """فرم ویرایش پروفایل کاربر"""
    fullname = StringField(
        'نام کامل', 
        validators=[DataRequired(), Length(max=100)],
        render_kw={"placeholder": "نام و نام خانوادگی"}
    )
    email = EmailField(
        'ایمیل', 
        validators=[Optional(), Email()],
        render_kw={"placeholder": "ایمیل"}
    )
    phone = TelField(
        'شماره تماس', 
        validators=[DataRequired(), Regexp('^09[0-9]{9}$', message='شماره موبایل معتبر نیست')],
        render_kw={"placeholder": "09xxxxxxxxx"}
    )
    address = StringField(
        'آدرس', 
        validators=[Optional(), Length(max=300)],
        render_kw={"placeholder": "آدرس کامل"}
    )
    postal_code = StringField(
        'کد پستی', 
        validators=[Optional(), Regexp('^[0-9]{10}$', message='کد پستی 10 رقمی معتبر نیست')],
        render_kw={"placeholder": "کد پستی"}
    )
    submit = SubmitField('ذخیره تغییرات')


class ChangePasswordForm(FlaskForm):
    """فرم تغییر رمز عبور"""
    current_password = PasswordField(
        'رمز عبور فعلی', 
        validators=[DataRequired()],
        render_kw={"placeholder": "رمز عبور فعلی"}
    )
    new_password = PasswordField(
        'رمز عبور جدید', 
        validators=[DataRequired(), Length(min=6, message='رمز عبور حداقل 6 کاراکتر باشد')],
        render_kw={"placeholder": "رمز عبور جدید"}
    )
    confirm_password = PasswordField(
        'تکرار رمز عبور جدید', 
        validators=[DataRequired(), EqualTo('new_password', message='رمز عبور با تکرار آن مطابقت ندارد')],
        render_kw={"placeholder": "تکرار رمز عبور جدید"}
    )
    submit = SubmitField('تغییر رمز عبور')


# ============================================
# بخش 5: اعتبارسنجی‌های سفارشی
# ============================================

def validate_phone_number(form, field):
    """اعتبارسنجی شماره تلفن با فرمت ایران"""
    phone = field.data
    if phone:
        phone = ''.join(filter(str.isdigit, phone))
        if not phone.startswith('09') or len(phone) != 11:
            raise ValidationError('شماره موبایل باید با 09 شروع شده و 11 رقم باشد')


def validate_national_code(form, field):
    """اعتبارسنجی کد ملی ایران"""
    code = field.data
    if code:
        code = ''.join(filter(str.isdigit, code))
        if len(code) != 10:
            raise ValidationError('کد ملی باید 10 رقم باشد')
        
        try:
            total = 0
            for i in range(9):
                total += int(code[i]) * (10 - i)
            remainder = total % 11
            check_digit = int(code[9])
            if not (remainder < 2 and check_digit == remainder or remainder >= 2 and check_digit == 11 - remainder):
                raise ValidationError('کد ملی معتبر نیست')
        except:
            raise ValidationError('کد ملی معتبر نیست')


def validate_project_code(form, field):
    """اعتبارسنجی کد پروژه"""
    code = field.data
    if code:
        code = ''.join(filter(str.isdigit, code))
        if len(code) != 16:
            raise ValidationError('کد پروژه باید 16 رقم باشد')


# ============================================
# بخش 6: فرم‌های ادمین
# ============================================

class AdminUserEditForm(FlaskForm):
    """فرم ویرایش کاربر توسط ادمین"""
    fullname = StringField(
        'نام کامل', 
        validators=[DataRequired(), Length(max=100)]
    )
    email = EmailField(
        'ایمیل', 
        validators=[Optional(), Email()]
    )
    phone = TelField(
        'شماره تماس', 
        validators=[DataRequired(), Regexp('^09[0-9]{9}$', message='شماره موبایل معتبر نیست')]
    )
    role = SelectField(
        'نقش', 
        choices=[
            ('admin', 'ادمین'),
            ('manager', 'مدیر پروژه'),
            ('employer', 'کارفرما'),
            ('employee', 'عامل اجرایی')
        ], 
        validators=[DataRequired()]
    )
    is_active = BooleanField('فعال')
    is_verified = BooleanField('تایید شده')
    submit = SubmitField('ذخیره تغییرات')


class AdminManagerApproveForm(FlaskForm):
    """فرم تایید مدیر توسط ادمین"""
    status = SelectField(
        'وضعیت', 
        choices=[
            ('approved', 'تایید'),
            ('rejected', 'رد')
        ], 
        validators=[DataRequired()]
    )
    note = TextAreaField(
        'توضیحات', 
        validators=[Optional(), Length(max=500)],
        render_kw={"placeholder": "توضیحات برای مدیر...", "rows": 3}
    )
    submit = SubmitField('ثبت')


# ============================================
# بخش 7: فرم‌های گزارش و فیلتر پیشرفته
# ============================================

class DateRangeForm(FlaskForm):
    """فرم بازه زمانی"""
    start_date = DateField(
        'از تاریخ', 
        validators=[Optional()],
        render_kw={"placeholder": "YYYY-MM-DD"}
    )
    end_date = DateField(
        'تا تاریخ', 
        validators=[Optional()],
        render_kw={"placeholder": "YYYY-MM-DD"}
    )
    submit = SubmitField('فیلتر')


class ReportFilterForm(FlaskForm):
    """فرم فیلتر گزارشات"""
    date_range = StringField(
        'بازه زمانی', 
        validators=[Optional()],
        render_kw={"placeholder": "انتخاب بازه زمانی..."}
    )
    status = SelectField(
        'وضعیت', 
        choices=[
            ('', 'همه'),
            ('active', 'فعال'),
            ('completed', 'تکمیل شده'),
            ('pending', 'در انتظار'),
            ('rejected', 'رد شده')
        ], 
        validators=[Optional()]
    )
    sort_by = SelectField(
        'مرتب‌سازی بر اساس', 
        choices=[
            ('created_at_desc', 'جدیدترین'),
            ('created_at_asc', 'قدیمی‌ترین'),
            ('title_asc', 'عنوان (الفبا)'),
            ('title_desc', 'عنوان (الفبا معکوس)')
        ], 
        default='created_at_desc',
        validators=[Optional()]
    )
    submit = SubmitField('اعمال فیلتر')