from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, TextAreaField, SubmitField, SelectField
from wtforms.validators import DataRequired, Email, Length, EqualTo, ValidationError
from app.models.user import User
from app.models.school import School


class LoginForm(FlaskForm):
    email = StringField('Email', validators=[DataRequired(), Email()])
    password = PasswordField('Password', validators=[DataRequired()])
    submit = SubmitField('Masuk')


class SettingsForm(FlaskForm):
    name = StringField('Nama Lengkap', validators=[DataRequired(), Length(max=150)])
    email = StringField('Email', validators=[DataRequired(), Email(), Length(max=120)])
    language = SelectField('Bahasa / Language / اللغة', choices=[
        ('id', 'Indonesia'),
        ('en', 'English (US)'),
        ('ar', 'العربية (Arabic)')
    ])
    current_password = PasswordField('Password Saat Ini (kosongkan jika tidak ingin ganti password)')
    new_password = PasswordField('Password Baru')
    confirm_password = PasswordField('Konfirmasi Password Baru', validators=[EqualTo('new_password', message='Password tidak cocok')])
    submit = SubmitField('Simpan Perubahan')

    def __init__(self, original_email, *args, **kwargs):
        super(SettingsForm, self).__init__(*args, **kwargs)
        self.original_email = original_email

    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 sudah digunakan.')

    def validate_new_password(self, field):
        if field.data and len(field.data) < 6:
            raise ValidationError('Password minimal 6 karakter.')


class SchoolRegistrationForm(FlaskForm):
    # School info
    school_name = StringField('Nama Sekolah', validators=[DataRequired(), Length(max=200)])
    npsn = StringField('NPSN', validators=[DataRequired(), Length(max=20)])
    address = TextAreaField('Alamat Sekolah', validators=[DataRequired()])
    school_phone = StringField('Telepon Sekolah', validators=[Length(max=20)])
    school_email = StringField('Email Sekolah', validators=[Email(), Length(max=120)])

    # Admin info
    admin_name = StringField('Nama Admin', validators=[DataRequired(), Length(max=150)])
    admin_email = StringField('Email Admin', validators=[DataRequired(), Email(), Length(max=120)])
    admin_password = PasswordField('Password', validators=[DataRequired(), Length(min=6)])
    admin_password_confirm = PasswordField('Konfirmasi Password',
                                           validators=[DataRequired(), EqualTo('admin_password', message='Password tidak cocok')])
    submit = SubmitField('Daftarkan Sekolah')

    def validate_npsn(self, field):
        if School.query.filter_by(npsn=field.data).first():
            raise ValidationError('NPSN sudah terdaftar.')

    def validate_admin_email(self, field):
        if User.query.filter_by(email=field.data).first():
            raise ValidationError('Email sudah digunakan.')

    def validate_school_email(self, field):
        if field.data:
            existing = School.query.filter_by(email=field.data).first()
            if existing:
                raise ValidationError('Email sekolah sudah terdaftar.')
