from __future__ import annotations
from datetime import datetime
from typing import Dict, List, Optional
from pydantic import BaseModel, Field, field_validator


class FeatureFlagResponse(BaseModel):
    slug: str
    name: str
    description: Optional[str] = None
    is_default: bool
    is_active: bool

    model_config = {"from_attributes": True}


class FeaturePlanItemCreate(BaseModel):
    feature_slug: str
    is_enabled: bool = True


class FeaturePlanItemResponse(BaseModel):
    feature_slug: str
    is_enabled: bool

    model_config = {"from_attributes": True}


class FeaturePlanCreate(BaseModel):
    name: str = Field(..., min_length=1, max_length=255)
    description: Optional[str] = None
    items: List[FeaturePlanItemCreate] = Field(default_factory=list)


class FeaturePlanUpdate(BaseModel):
    name: Optional[str] = Field(None, min_length=1, max_length=255)
    description: Optional[str] = None
    items: Optional[List[FeaturePlanItemCreate]] = None


class FeaturePlanResponse(BaseModel):
    id: int
    uuid: str
    name: str
    description: Optional[str] = None
    is_active: bool
    created_by: Optional[int] = None
    created_at: datetime
    updated_at: Optional[datetime] = None
    items: List[FeaturePlanItemResponse] = Field(default_factory=list)

    model_config = {"from_attributes": True}


class FeaturePlanAssignRequest(BaseModel):
    merchant_ids: List[int] = Field(..., min_length=1, max_length=500)
    notes: Optional[str] = None


class FeatureOverrideItem(BaseModel):
    feature_slug: str
    is_enabled: Optional[bool] = None
    reason: Optional[str] = None


class FeatureOverridePatchRequest(BaseModel):
    overrides: List[FeatureOverrideItem] = Field(..., min_length=1)


class MerchantFeatureOverrideResponse(BaseModel):
    feature_slug: str
    is_enabled: bool
    reason: Optional[str] = None
    set_at: datetime

    model_config = {"from_attributes": True}


class MerchantFeaturePlanResponse(BaseModel):
    id: int
    plan_id: int
    plan_name: str
    plan_description: Optional[str] = None
    is_active: bool
    assigned_at: datetime
    notes: Optional[str] = None

    model_config = {"from_attributes": True}


class MerchantFeatureStateResponse(BaseModel):
    current_plan: Optional[MerchantFeaturePlanResponse] = None
    resolved_features: Dict[str, bool]
    overrides: List[MerchantFeatureOverrideResponse] = Field(default_factory=list)


class FeatureMeResponse(BaseModel):
    features: Dict[str, bool]
    plan_name: Optional[str] = None
    plan_id: Optional[int] = None
