"""SP3 marketplace forms — buyer registry, products, demand listings."""
from __future__ import annotations

from django import forms
from django.forms import inlineformset_factory

from apps.core.countries import CountryMultipleChoiceField
from apps.smehub._shared.choices import COUNTRIES, SECTORS
from apps.smehub.marketplace.models import (
    BuyerRegistryEntry,
    DemandResponse,
    MarketDemandListing,
    ProductListing,
    ProductMedia,
)

INPUT_BASE = (
    "block w-full rounded-lg border border-ruforum-border bg-white px-3 py-2 "
    "text-sm text-ruforum-text shadow-sm placeholder-ruforum-text-muted/70 "
    "focus:border-ruforum-primary focus:outline-none focus:ring-1 focus:ring-ruforum-primary"
)
TEXTAREA_BASE = INPUT_BASE + " min-h-[7rem]"
SELECT_BASE = INPUT_BASE


def _s2_single(*, placeholder: str = "") -> dict:
    attrs = {"class": SELECT_BASE, "data-s2": ""}
    if placeholder:
        attrs["data-s2-placeholder"] = placeholder
    return attrs


def _s2_multi(*, placeholder: str) -> dict:
    return {
        "class": SELECT_BASE + " min-h-[2.5rem]",
        "data-s2": "",
        "data-s2-placeholder": placeholder,
    }


# ---------------------------------------------------------------------------
# Buyer registry
# ---------------------------------------------------------------------------

class BuyerRegistryForm(forms.ModelForm):
    sectors_sourced = forms.MultipleChoiceField(
        required=False,
        choices=SECTORS,
        widget=forms.SelectMultiple(attrs=_s2_multi(placeholder="Pick sectors you source")),
    )
    geographic_coverage = CountryMultipleChoiceField(
        required=False,
        choices=COUNTRIES,
        widget=forms.SelectMultiple(attrs=_s2_multi(placeholder="Countries you source from")),
    )

    class Meta:
        model = BuyerRegistryEntry
        fields = [
            "organisation_name",
            "org_type",
            "sectors_sourced",
            "geographic_coverage",
            "contact_email",
            "contact_phone",
            "website",
            "description",
            "typical_volume",
        ]
        widgets = {
            "organisation_name": forms.TextInput(attrs={"class": INPUT_BASE}),
            "org_type": forms.Select(attrs=_s2_single(placeholder="Organisation type")),
            "contact_email": forms.EmailInput(attrs={"class": INPUT_BASE}),
            "contact_phone": forms.TextInput(attrs={"class": INPUT_BASE}),
            "website": forms.URLInput(attrs={"class": INPUT_BASE, "placeholder": "https://"}),
            "description": forms.Textarea(attrs={"class": TEXTAREA_BASE}),
            "typical_volume": forms.TextInput(attrs={"class": INPUT_BASE}),
        }


# ---------------------------------------------------------------------------
# Product listing
# ---------------------------------------------------------------------------

class ProductListingForm(forms.ModelForm):
    sector = forms.ChoiceField(
        choices=SECTORS,
        widget=forms.Select(attrs=_s2_single(placeholder="Sector")),
    )
    geographic_reach = CountryMultipleChoiceField(
        required=False,
        choices=COUNTRIES,
        widget=forms.SelectMultiple(attrs=_s2_multi(placeholder="Countries served")),
    )

    class Meta:
        model = ProductListing
        fields = [
            "name",
            "description",
            "sector",
            "sub_sector",
            "pricing",
            "minimum_order",
            "availability",
            "geographic_reach",
            "cover_image",
        ]
        widgets = {
            "name": forms.TextInput(attrs={"class": INPUT_BASE}),
            "description": forms.Textarea(attrs={"class": TEXTAREA_BASE}),
            "sub_sector": forms.TextInput(attrs={"class": INPUT_BASE}),
            "pricing": forms.TextInput(attrs={"class": INPUT_BASE}),
            "minimum_order": forms.TextInput(attrs={"class": INPUT_BASE}),
            "availability": forms.Select(attrs=_s2_single(placeholder="Pick availability")),
        }


# ---------------------------------------------------------------------------
# Market demand
# ---------------------------------------------------------------------------

class MarketDemandForm(forms.ModelForm):
    sector_targeting = forms.MultipleChoiceField(
        required=False,
        choices=SECTORS,
        widget=forms.SelectMultiple(attrs=_s2_multi(placeholder="Target sectors")),
    )
    geographic_targeting = CountryMultipleChoiceField(
        required=False,
        choices=COUNTRIES,
        widget=forms.SelectMultiple(attrs=_s2_multi(placeholder="Target countries")),
    )

    class Meta:
        model = MarketDemandListing
        fields = [
            "title",
            "kind",
            "description",
            "sector_targeting",
            "geographic_targeting",
            "quantity",
            "deadline",
        ]
        widgets = {
            "title": forms.TextInput(attrs={"class": INPUT_BASE}),
            "kind": forms.Select(attrs=_s2_single(placeholder="Listing type")),
            "description": forms.Textarea(attrs={"class": TEXTAREA_BASE}),
            "quantity": forms.TextInput(attrs={"class": INPUT_BASE}),
            "deadline": forms.DateTimeInput(
                attrs={"class": INPUT_BASE, "type": "datetime-local"},
                format="%Y-%m-%dT%H:%M",
            ),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["deadline"].input_formats = [
            "%Y-%m-%dT%H:%M",
            "%Y-%m-%d %H:%M:%S",
            "%Y-%m-%d %H:%M",
        ]


class DemandResponseForm(forms.ModelForm):
    business = forms.ModelChoiceField(
        queryset=None,
        widget=forms.Select(attrs=_s2_single(placeholder="Pick a business")),
    )
    product_listing = forms.ModelChoiceField(
        queryset=None,
        required=False,
        widget=forms.Select(attrs=_s2_single(placeholder="Optional: link an existing listing")),
    )

    class Meta:
        model = DemandResponse
        fields = ["business", "product_listing", "message", "pricing_offer", "attachment"]
        widgets = {
            "message": forms.Textarea(attrs={"class": TEXTAREA_BASE}),
            "pricing_offer": forms.TextInput(attrs={"class": INPUT_BASE}),
        }

    def __init__(self, *args, entrepreneur=None, **kwargs):
        super().__init__(*args, **kwargs)
        from apps.smehub.onboarding.models import Business
        self.fields["business"].queryset = Business.objects.filter(
            entrepreneur=entrepreneur,
            verification_status=Business.Status.VERIFIED,
        )
        self.fields["product_listing"].queryset = ProductListing.objects.filter(
            entrepreneur=entrepreneur,
            status=ProductListing.Status.PUBLISHED,
        )


class ProductMediaForm(forms.ModelForm):
    class Meta:
        model = ProductMedia
        fields = ["kind", "title", "file", "external_url", "sort_order"]
        widgets = {
            "kind": forms.Select(attrs={"class": SELECT_BASE}),
            "title": forms.TextInput(attrs={"class": INPUT_BASE, "placeholder": "Optional caption"}),
            "external_url": forms.URLInput(attrs={"class": INPUT_BASE, "placeholder": "https:// (for video links)"}),
            "sort_order": forms.NumberInput(attrs={"class": INPUT_BASE, "min": 0}),
        }


ProductMediaFormSet = inlineformset_factory(
    ProductListing,
    ProductMedia,
    form=ProductMediaForm,
    extra=2,
    max_num=8,
    can_delete=True,
)


class DemandResponseDecisionForm(forms.Form):
    OUTCOME_CHOICES = [
        ("shortlisted", "Shortlist"),
        ("awarded", "Award"),
        ("declined", "Decline"),
    ]
    outcome = forms.ChoiceField(
        choices=OUTCOME_CHOICES,
        widget=forms.Select(attrs=_s2_single(placeholder="Pick outcome")),
    )
    note = forms.CharField(
        required=False,
        widget=forms.Textarea(attrs={"class": TEXTAREA_BASE, "rows": 3}),
    )


# ---------------------------------------------------------------------------
# Market validation + sales (Phase 6.3)
# ---------------------------------------------------------------------------

from apps.core.money.currencies import ISO4217_CHOICES
from apps.smehub.marketplace.models import MarketValidation, SalesRecord


class MarketValidationForm(forms.ModelForm):
    class Meta:
        model = MarketValidation
        fields = [
            "method",
            "validator_name",
            "validator_email",
            "conducted_at",
            "problem_fit_score",
            "solution_fit_score",
            "willingness_to_pay_score",
            "willingness_to_pay_amount",
            "currency",
            "notes",
            "evidence_file",
        ]
        widgets = {
            "method": forms.Select(attrs={"class": SELECT_BASE}),
            "validator_name": forms.TextInput(attrs={"class": INPUT_BASE}),
            "validator_email": forms.EmailInput(attrs={"class": INPUT_BASE}),
            "conducted_at": forms.DateTimeInput(
                attrs={"class": INPUT_BASE, "type": "datetime-local"},
            ),
            "problem_fit_score": forms.NumberInput(attrs={"class": INPUT_BASE, "min": 1, "max": 5}),
            "solution_fit_score": forms.NumberInput(attrs={"class": INPUT_BASE, "min": 1, "max": 5}),
            "willingness_to_pay_score": forms.NumberInput(attrs={"class": INPUT_BASE, "min": 1, "max": 5}),
            "willingness_to_pay_amount": forms.NumberInput(
                attrs={"class": INPUT_BASE, "step": "0.01"},
            ),
            "currency": forms.Select(
                choices=[("", "---")] + list(ISO4217_CHOICES),
                attrs=_s2_single(placeholder="Currency"),
            ),
            "notes": forms.Textarea(attrs={"class": TEXTAREA_BASE, "rows": 4}),
            "evidence_file": forms.ClearableFileInput(attrs={"class": INPUT_BASE}),
        }


class SalesRecordForm(forms.ModelForm):
    class Meta:
        model = SalesRecord
        fields = [
            "product_listing",
            "channel",
            "buyer_entry",
            "customer_name",
            "quantity",
            "unit",
            "unit_price",
            "gross_amount",
            "currency",
            "sale_date",
            "notes",
            "evidence_file",
        ]
        widgets = {
            "product_listing": forms.Select(attrs=_s2_single(placeholder="(optional)")),
            "channel": forms.Select(attrs={"class": SELECT_BASE}),
            "buyer_entry": forms.Select(attrs=_s2_single(placeholder="(optional)")),
            "customer_name": forms.TextInput(attrs={"class": INPUT_BASE}),
            "quantity": forms.NumberInput(attrs={"class": INPUT_BASE, "step": "0.01", "min": "0"}),
            "unit": forms.TextInput(attrs={"class": INPUT_BASE, "placeholder": "units / kg / ..."}),
            "unit_price": forms.NumberInput(attrs={"class": INPUT_BASE, "step": "0.01", "min": "0"}),
            "gross_amount": forms.NumberInput(attrs={"class": INPUT_BASE, "step": "0.01", "min": "0"}),
            "currency": forms.Select(
                choices=ISO4217_CHOICES,
                attrs=_s2_single(placeholder="Currency"),
            ),
            "sale_date": forms.DateInput(
                attrs={"class": INPUT_BASE, "type": "date"},
            ),
            "notes": forms.Textarea(attrs={"class": TEXTAREA_BASE, "rows": 3}),
            "evidence_file": forms.ClearableFileInput(attrs={"class": INPUT_BASE}),
        }

    def __init__(self, *args, business=None, **kwargs):
        super().__init__(*args, **kwargs)
        if business is not None:
            self.fields["product_listing"].queryset = ProductListing.objects.filter(business=business)
            from apps.smehub.marketplace.models import BuyerRegistryEntry as _Buyer

            self.fields["buyer_entry"].queryset = _Buyer.objects.filter(
                verification_status=_Buyer.Status.VERIFIED,
            )


class SalesDisputeForm(forms.Form):
    reason = forms.CharField(
        widget=forms.Textarea(attrs={"class": TEXTAREA_BASE, "rows": 3}),
    )


class SalesCancelForm(forms.Form):
    reason = forms.CharField(
        required=False,
        widget=forms.Textarea(attrs={"class": TEXTAREA_BASE, "rows": 3}),
    )
