from flask_wtf import FlaskForm
from wtforms import PasswordField, SelectField, StringField, SubmitField
from wtforms.validators import DataRequired, Email, EqualTo, Length, Optional

from web_application.constants import roles


class UserCreateForm(FlaskForm):
    full_name = StringField(
        "Ad Soyad", validators=[DataRequired(), Length(min=2, max=50)]
    )
    username = StringField("Kullanıcı Adı", validators=[Optional()])
    email = StringField("Email", validators=[DataRequired(), Email()])
    phone = StringField("Telefon", validators=[Optional()])
    password = PasswordField("Şifre", validators=[DataRequired(), Length(min=6)])
    confirm_password = PasswordField(
        "Şifre Tekrar", validators=[DataRequired(), EqualTo("password")]
    )
    role = SelectField("Rol", coerce=int, validators=[DataRequired()])
    status = SelectField(
        "Durum",
        choices=[(1, "Aktif"), (9, "Pasif")],
        coerce=int,
        validators=[DataRequired()],
    )
    submit = SubmitField("Kaydet")

    def __init__(self, *args, **kwargs):
        super(UserCreateForm, self).__init__(*args, **kwargs)
        # Populate role choices dynamically from constants
        # roles dict structure: "RoleName": {"id": 1, ...}
        # We want choices to be [(1, "Misafir"), (2, "Admin"), ...]
        self.role.choices = [
            (info["id"], info["tr_title"]) for key, info in roles.items()
        ]


class UserEditForm(FlaskForm):
    full_name = StringField(
        "Ad Soyad", validators=[DataRequired(), Length(min=2, max=50)]
    )
    email = StringField("Email", validators=[DataRequired(), Email()])
    phone = StringField("Telefon", validators=[Optional()])
    role = SelectField("Rol", coerce=int, validators=[DataRequired()])
    status = SelectField(
        "Durum",
        choices=[(1, "Aktif"), (9, "Pasif")],
        coerce=int,
        validators=[DataRequired()],
    )
    submit = SubmitField("Güncelle")

    def __init__(self, *args, **kwargs):
        super(UserEditForm, self).__init__(*args, **kwargs)
        # Populate role choices dynamically from constants
        self.role.choices = [
            (info["id"], info["tr_title"]) for key, info in roles.items()
        ]
