# app/admin/forms.py

from flask_wtf import FlaskForm
from wtforms import (
    StringField, TextAreaField, SelectField, SubmitField, 
    FloatField, IntegerField, BooleanField, DecimalField, 
    DateTimeField, DateField, FileField
)
from wtforms.validators import (
    DataRequired, Optional, Length, NumberRange, 
    Email, Regexp, ValidationError
)
from app.models import EscrowAccount

# ==================== فرم‌های صندوق امانی ====================

class CreateEscrowForm(FlaskForm):
    """فرم ایجاد صندوق امانی مرکزی توسط ادمین"""
    
    bank_name = StringField('نام بانک', validators=[
        DataRequired(message='نام بانک الزامی است'),
        Length(min=2, max=100, message='نام بانک باید بین 2 تا 100 کاراکتر باشد')
    ])
    
    bank_branch = StringField('شعبه بانک', validators=[
        Optional(),
        Length(max=100, message='شعبه بانک حداکثر 100 کاراکتر')
    ])
    
    account_number = StringField('شماره حساب', validators=[
        DataRequired(message='شماره حساب الزامی است'),
        Length(min=10, max=20, message='شماره حساب باید بین 10 تا 20 رقم باشد'),
        Regexp(r'^\d+$', message='شماره حساب باید فقط شامل اعداد باشد')
    ])
    
    shaba_number = StringField('شماره شبا (اختیاری)', validators=[
        Optional(),
        Length(min=24, max=26, message='شماره شبا باید 24 تا 26 کاراکتر باشد'),
        Regexp(r'^IR\d{24}$', message='شماره شبا باید با IR شروع و 24 رقم داشته باشد')
    ])
    
    card_number = StringField('شماره کارت (اختیاری)', validators=[
        Optional(),
        Length(min=16, max=16, message='شماره کارت باید 16 رقم باشد'),
        Regexp(r'^\d{16}$', message='شماره کارت باید 16 رقم باشد')
    ])
    
    initial_balance = FloatField('موجودی اولیه (ریال)', validators=[
        Optional(),
        NumberRange(min=0, message='موجودی نمی‌تواند منفی باشد')
    ], default=0)
    
    description = TextAreaField('توضیحات', validators=[
        Optional(),
        Length(max=500, message='توضیحات حداکثر 500 کاراکتر')
    ])
    
    is_active = BooleanField('فعال', default=True)
    
    submit = SubmitField('ایجاد صندوق امانی')
    
    def validate_account_number(self, field):
        """اعتبارسنجی شماره حساب - بررسی عدم تکراری بودن"""
        escrow = EscrowAccount.query.filter_by(account_number=field.data).first()
        if escrow:
            raise ValidationError('این شماره حساب قبلاً در سیستم ثبت شده است.')


class EditEscrowForm(FlaskForm):
    """فرم ویرایش صندوق امانی توسط ادمین"""
    
    bank_name = StringField('نام بانک', validators=[
        DataRequired(message='نام بانک الزامی است'),
        Length(min=2, max=100, message='نام بانک باید بین 2 تا 100 کاراکتر باشد')
    ])
    
    bank_branch = StringField('شعبه بانک', validators=[
        Optional(),
        Length(max=100, message='شعبه بانک حداکثر 100 کاراکتر')
    ])
    
    account_number = StringField('شماره حساب', validators=[
        DataRequired(message='شماره حساب الزامی است'),
        Length(min=10, max=20, message='شماره حساب باید بین 10 تا 20 رقم باشد'),
        Regexp(r'^\d+$', message='شماره حساب باید فقط شامل اعداد باشد')
    ])
    
    shaba_number = StringField('شماره شبا (اختیاری)', validators=[
        Optional(),
        Length(min=24, max=26, message='شماره شبا باید 24 تا 26 کاراکتر باشد'),
        Regexp(r'^IR\d{24}$', message='شماره شبا باید با IR شروع و 24 رقم داشته باشد')
    ])
    
    card_number = StringField('شماره کارت (اختیاری)', validators=[
        Optional(),
        Length(min=16, max=16, message='شماره کارت باید 16 رقم باشد'),
        Regexp(r'^\d{16}$', message='شماره کارت باید 16 رقم باشد')
    ])
    
    description = TextAreaField('توضیحات', validators=[
        Optional(),
        Length(max=500, message='توضیحات حداکثر 500 کاراکتر')
    ])
    
    is_active = BooleanField('فعال', default=True)
    
    submit = SubmitField('ذخیره تغییرات')


# ==================== فرم‌های تبلیغات ====================

class AdvertisementApproveForm(FlaskForm):
    """فرم تایید/رد تبلیغات"""
    status = SelectField(
        'وضعیت',
        choices=[
            ('approved', 'تایید'),
            ('rejected', 'رد')
        ],
        validators=[DataRequired()]
    )
    note = TextAreaField(
        'یادداشت',
        validators=[Optional(), Length(max=500)],
        render_kw={'rows': 3}
    )
    submit = SubmitField('ثبت وضعیت')


class AdvertisementEditForm(FlaskForm):
    """فرم ویرایش تبلیغات"""
    title = StringField(
        'عنوان تبلیغ',
        validators=[DataRequired(), Length(min=3, max=100)]
    )
    description = TextAreaField(
        'توضیحات',
        validators=[DataRequired(), Length(min=10, max=1000)]
    )
    price = DecimalField(
        'قیمت (تومان)',
        validators=[DataRequired(), NumberRange(min=0)]
    )
    duration_days = IntegerField(
        'مدت (روز)',
        validators=[DataRequired(), NumberRange(min=1, max=365)]
    )
    position = SelectField(
        'موقعیت نمایش',
        choices=[
            ('sidebar', 'سایدبار'),
            ('header', 'بالای صفحه'),
            ('footer', 'پایین صفحه'),
            ('popup', 'پاپ‌آپ'),
            ('banner', 'بنر اصلی')
        ],
        validators=[DataRequired()]
    )
    start_date = DateTimeField(
        'تاریخ شروع',
        validators=[Optional()],
        format='%Y-%m-%d'
    )
    end_date = DateTimeField(
        'تاریخ پایان',
        validators=[Optional()],
        format='%Y-%m-%d'
    )
    submit = SubmitField('ذخیره تغییرات')


# ==================== فرم‌های مدیریت مدیران ====================

class ManagerApproveForm(FlaskForm):
    """فرم تایید/رد درخواست مدیر پروژه"""
    status = SelectField('وضعیت', choices=[
        ('approved', 'تایید عضویت'),
        ('rejected', 'رد درخواست')
    ], validators=[DataRequired()])
    note = TextAreaField('توضیحات', validators=[Optional(), Length(max=500)])
    submit = SubmitField('ثبت وضعیت')


# ==================== فرم‌های پرداخت ====================

class PaymentReleaseProcessForm(FlaskForm):
    """فرم پردازش آزادسازی پرداخت"""
    due_days = IntegerField(
        'سررسید (روز)',
        validators=[DataRequired(), NumberRange(min=1, max=90)],
        default=30
    )
    bank_name = SelectField('بانک صادرکننده', choices=[
        ('ملت', 'بانک ملت'),
        ('ملی', 'بانک ملی'),
        ('صادرات', 'بانک صادرات'),
        ('تجارت', 'بانک تجارت'),
        ('رفاه', 'بانک رفاه'),
        ('پاسارگاد', 'بانک پاسارگاد'),
        ('سامان', 'بانک سامان'),
        ('اقتصاد نوین', 'بانک اقتصاد نوین')
    ], validators=[DataRequired()])
    submit = SubmitField('صدور چک الکترونیک')


class ElectronicCheckForm(FlaskForm):
    """فرم صدور چک الکترونیک"""
    project_id = SelectField('پروژه', coerce=int, validators=[DataRequired()])
    employee_id = SelectField('گیرنده', coerce=int, validators=[DataRequired()])
    amount = FloatField('مبلغ (ریال)', validators=[
        DataRequired(),
        NumberRange(min=1000, message='مبلغ باید حداقل 1000 ریال باشد')
    ])
    check_number = StringField('شماره چک', validators=[
        DataRequired(),
        Length(min=8, max=20)
    ])
    issue_date = DateField('تاریخ صدور', validators=[DataRequired()], format='%Y-%m-%d')
    due_date = DateField('تاریخ سررسید', validators=[DataRequired()], format='%Y-%m-%d')
    bank_name = StringField('نام بانک', validators=[
        DataRequired(),
        Length(min=2, max=100)
    ])
    account_number = StringField('شماره حساب', validators=[
        DataRequired(),
        Length(min=10, max=20)
    ])
    description = TextAreaField('توضیحات', validators=[Optional(), Length(max=500)])
    submit = SubmitField('صدور چک')