from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileAllowed
from wtforms import (StringField, TextAreaField, PasswordField, SelectField,
                     BooleanField, SubmitField, HiddenField)
from wtforms.validators import DataRequired, Email, Length, EqualTo, Optional, ValidationError
from models import User


class LoginForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired(), Length(min=3, max=80)])
    password = PasswordField('Password', validators=[DataRequired()])
    remember = BooleanField('Remember Me')
    submit = SubmitField('Sign In')


class UserForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired(), Length(min=3, max=80)])
    email = StringField('Email', validators=[DataRequired(), Email(), Length(max=120)])
    display_name = StringField('Display Name (EN)', validators=[DataRequired(), Length(max=120)])
    display_name_ar = StringField('Display Name (AR)', validators=[Optional(), Length(max=120)])
    role = SelectField('Role', choices=[('editor', 'Editor'), ('admin', 'Admin')])
    password = PasswordField('Password', validators=[Optional(), Length(min=6)])
    password_confirm = PasswordField('Confirm Password', validators=[
        Optional(), EqualTo('password', message='Passwords must match')
    ])
    is_active_user = BooleanField('Active', default=True)
    avatar = FileField('Avatar', validators=[
        FileAllowed(['jpg', 'jpeg', 'png', 'gif', 'webp'], 'Images only!')
    ])
    submit = SubmitField('Save')

    def __init__(self, original_username=None, original_email=None, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.original_username = original_username
        self.original_email = original_email

    def validate_username(self, field):
        if field.data != self.original_username:
            user = User.query.filter_by(username=field.data).first()
            if user:
                raise ValidationError('Username already taken.')

    def validate_email(self, field):
        if field.data != self.original_email:
            user = User.query.filter_by(email=field.data).first()
            if user:
                raise ValidationError('Email already registered.')


class ArticleForm(FlaskForm):
    title_en = StringField('Title (English)', validators=[DataRequired(), Length(max=300)])
    subtitle_en = StringField('Subtitle (English)', validators=[Optional(), Length(max=500)])
    content_en = HiddenField('Content (English)', validators=[DataRequired()])

    title_ar = StringField('العنوان (عربي)', validators=[Optional(), Length(max=300)])
    subtitle_ar = StringField('العنوان الفرعي (عربي)', validators=[Optional(), Length(max=500)])
    content_ar = HiddenField('المحتوى (عربي)', validators=[Optional()])

    category_id = SelectField('Category', coerce=int, validators=[DataRequired()])
    tags = StringField('Tags (comma-separated)', validators=[Optional()])

    featured_image = FileField('Featured Image', validators=[
        FileAllowed(['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg'], 'Images only!')
    ])
    featured_image_caption = StringField('Image Caption', validators=[Optional(), Length(max=300)])

    video_file = FileField('Video File', validators=[
        FileAllowed(['mp4', 'webm', 'ogg'], 'Video files only!')
    ])
    youtube_url = StringField('YouTube URL', validators=[Optional(), Length(max=500)])
    audio_file = FileField('Audio File', validators=[
        FileAllowed(['mp3', 'wav', 'ogg', 'm4a'], 'Audio files only!')
    ])

    is_featured = BooleanField('Featured Article')
    is_breaking = BooleanField('Breaking News')
    status = SelectField('Status', choices=[
        ('draft', 'Draft'),
        ('pending', 'Pending Review'),
    ])

    submit = SubmitField('Save Article')


class CategoryForm(FlaskForm):
    name_en = StringField('Name (English)', validators=[DataRequired(), Length(max=100)])
    name_ar = StringField('الاسم (عربي)', validators=[DataRequired(), Length(max=100)])
    description_en = TextAreaField('Description (English)', validators=[Optional()])
    description_ar = TextAreaField('الوصف (عربي)', validators=[Optional()])
    color = StringField('Color', validators=[Optional(), Length(max=7)], default='#c70000')
    order = StringField('Display Order', default='0')
    is_active = BooleanField('Active', default=True)
    submit = SubmitField('Save Category')


class SiteSettingsForm(FlaskForm):
    header_logo = FileField('Header Logo', validators=[
        FileAllowed(['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg'], 'Images only!')
    ])
    footer_logo = FileField('Footer Logo', validators=[
        FileAllowed(['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg'], 'Images only!')
    ])
    header_logo_height = StringField('Header Logo Height (px)', validators=[Optional()], default='80')
    footer_logo_height = StringField('Footer Logo Height (px)', validators=[Optional()], default='300')
    submit = SubmitField('Save Settings')
