"""Marketplace forms.

The create-listing form exposes only the MVP fields. Category choices are
populated by the route from the active categories; condition choices come from
the :class:`ListingCondition` enum.
"""

from __future__ import annotations

from flask_wtf import FlaskForm
from flask_wtf.file import MultipleFileField
from wtforms import (
    BooleanField,
    DecimalField,
    SelectField,
    StringField,
    SubmitField,
    TextAreaField,
)
from wtforms.validators import DataRequired, Length, NumberRange

from app.marketplace.validators import validate_listing_images
from app.models.enums import ListingCondition


class ListingForm(FlaskForm):
    """Create a marketplace listing (MVP fields only)."""

    title = StringField(
        "Title", validators=[DataRequired(), Length(min=3, max=200)]
    )
    description = TextAreaField(
        "Description", validators=[DataRequired(), Length(min=10)]
    )
    category_id = SelectField("Category", coerce=int, validators=[DataRequired()])
    price = DecimalField(
        "Price",
        places=2,
        validators=[DataRequired(), NumberRange(min=0.01, message="Enter a valid price.")],
    )
    condition = SelectField(
        "Condition",
        choices=[(c.value, c.value.title()) for c in ListingCondition],
        default=ListingCondition.GOOD.value,
        validators=[DataRequired()],
    )
    negotiable = BooleanField("Open to offers", default=True)
    images = MultipleFileField("Images (1–7)")
    submit = SubmitField("Publish listing")

    def validate_images(self, field) -> None:
        """Delegate image validation to the shared validator."""
        validate_listing_images(field.data or [])


class EditListingForm(ListingForm):
    """Edit an existing listing.

    Reuses every text field (and its validation) from :class:`ListingForm`,
    but drops the image upload — image management is a later phase, so existing
    images are shown read-only. Setting ``images = None`` unbinds the inherited
    field, so its image validator never runs.
    """

    images = None
