from pydantic import BaseModel, Field, field_validator, ConfigDict
from typing import Optional
from datetime import datetime
from enum import Enum

class DisputeReason(str, Enum):
    ITEM_NOT_RECEIVED = "ITEM_NOT_RECEIVED"
    ITEM_NOT_AS_DESCRIBED = "ITEM_NOT_AS_DESCRIBED"
    DAMAGED_ITEM = "DAMAGED_ITEM"
    COUNTERFEIT = "COUNTERFEIT"
    OTHER = "OTHER"

class DisputeStatus(str, Enum):
    OPEN = "OPEN"
    UNDER_REVIEW = "UNDER_REVIEW"
    RESOLVED = "RESOLVED"
    CLOSED = "CLOSED"
    ESCALATED = "ESCALATED"

class DisputeBase(BaseModel):
    order_id: str
    complainant_id: str
    respondent_id: str
    reason: DisputeReason
    description: str
    status: DisputeStatus
    resolution: Optional[str] = None
    resolved_by_id: Optional[str] = None
    resolved_at: Optional[datetime] = None

    @field_validator("description")
    @classmethod
    def validate_description(cls, v: str) -> str:
        if not v or len(v.strip()) == 0:
            raise ValueError("Description cannot be empty")
        return v

class DisputeCreate(BaseModel):
    order_id: str
    complainant_id: str
    respondent_id: str
    reason: DisputeReason
    description: str

    @field_validator("description")
    @classmethod
    def validate_description(cls, v: str) -> str:
        if not v or len(v.strip()) == 0:
            raise ValueError("Description cannot be empty")
        return v

class DisputeUpdate(BaseModel):
    order_id: Optional[str] = None
    complainant_id: Optional[str] = None
    respondent_id: Optional[str] = None
    reason: Optional[DisputeReason] = None
    description: Optional[str] = None
    status: Optional[DisputeStatus] = None
    resolution: Optional[str] = None
    resolved_by_id: Optional[str] = None
    resolved_at: Optional[datetime] = None

    @field_validator("description")
    @classmethod
    def validate_description(cls, v: Optional[str]) -> Optional[str]:
        if v is not None and len(v.strip()) == 0:
            raise ValueError("Description cannot be empty")
        return v

class DisputeResponse(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: str
    order_id: str
    complainant_id: str
    respondent_id: str
    reason: str
    description: str
    status: str
    resolution: Optional[str]
    resolved_by_id: Optional[str]
    resolved_at: Optional[datetime]
    created_at: datetime
    updated_at: datetime

class OrderItemResponse(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: str
    card_name: str

class OrderResponse(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    order_number: str
    order_items: list[OrderItemResponse]

class UserResponse(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    email: str

class DisputeDetailResponse(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: str
    order_id: str
    complainant_id: str
    respondent_id: str
    reason: str
    description: str
    status: str
    resolution: Optional[str]
    resolved_by_id: Optional[str]
    resolved_at: Optional[datetime]
    created_at: datetime
    updated_at: datetime
    order: OrderResponse
    complainant: UserResponse
    respondent: UserResponse
    resolved_by: Optional[UserResponse]