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


class ReportType(str, Enum):
    FRAUDULENT_LISTING = "Fraudulent Listing"
    COUNTERFEIT = "Counterfeit"
    INAPPROPRIATE_CONTENT = "Inappropriate Content"
    HARASSMENT = "Harassment"
    SPAM = "Spam"
    OTHER = "Other"


class ReportStatus(str, Enum):
    PENDING = "Pending"
    UNDER_REVIEW = "Under Review"
    RESOLVED = "Resolved"
    DISMISSED = "Dismissed"


class ReportBase(BaseModel):
    reporter_id: str
    reported_user_id: Optional[str] = None
    reported_listing_id: Optional[str] = None
    report_type: ReportType
    description: str
    status: ReportStatus
    reviewed_by_id: Optional[str] = None
    resolution_notes: Optional[str] = None
    resolved_at: Optional[datetime] = None

    @field_validator("description")
    @classmethod
    def validate_description(cls, v: str) -> str:
        if not v or not v.strip():
            raise ValueError("Description cannot be empty")
        if len(v.strip()) < 10:
            raise ValueError("Description must be at least 10 characters")
        return v.strip()

    @field_validator("reported_user_id", "reported_listing_id")
    @classmethod
    def validate_at_least_one_target(cls, v: Optional[str], info) -> Optional[str]:
        return v


class ReportCreate(BaseModel):
    reporter_id: str
    reported_user_id: Optional[str] = None
    reported_listing_id: Optional[str] = None
    report_type: ReportType
    description: str

    @field_validator("description")
    @classmethod
    def validate_description(cls, v: str) -> str:
        if not v or not v.strip():
            raise ValueError("Description cannot be empty")
        if len(v.strip()) < 10:
            raise ValueError("Description must be at least 10 characters")
        return v.strip()


class ReportUpdate(BaseModel):
    reporter_id: Optional[str] = None
    reported_user_id: Optional[str] = None
    reported_listing_id: Optional[str] = None
    report_type: Optional[ReportType] = None
    description: Optional[str] = None
    status: Optional[ReportStatus] = None
    reviewed_by_id: Optional[str] = None
    resolution_notes: 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:
            if not v.strip():
                raise ValueError("Description cannot be empty")
            if len(v.strip()) < 10:
                raise ValueError("Description must be at least 10 characters")
            return v.strip()
        return v


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

    id: str
    reporter_id: str
    reported_user_id: Optional[str]
    reported_listing_id: Optional[str]
    report_type: ReportType
    description: str
    status: ReportStatus
    reviewed_by_id: Optional[str]
    resolution_notes: Optional[str]
    resolved_at: Optional[datetime]
    created_at: datetime
    updated_at: datetime


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

    id: str
    reporter_id: str
    reported_user_id: Optional[str]
    reported_listing_id: Optional[str]
    report_type: ReportType
    description: str
    status: ReportStatus
    reviewed_by_id: Optional[str]
    resolution_notes: Optional[str]
    resolved_at: Optional[datetime]
    created_at: datetime
    updated_at: datetime
    reporter: Optional[dict] = None
    reported_user: Optional[dict] = None
    reported_listing: Optional[dict] = None
    reviewed_by: Optional[dict] = None