from enum import Enum
from typing import List, Optional, Any
from datetime import datetime
from pydantic import BaseModel, HttpUrl, Field, field_validator


class UrlList(BaseModel):
    urls: List[HttpUrl]

    model_config = {
        "json_schema_extra": {
            "example": {
                "urls": [
                    "https://example.com/page1",
                    "https://example.com/page2"
                ]
            }
        }
    }


class AddLinksResponse(BaseModel):
    added: int
    status: str

    model_config = {
        "json_schema_extra": {
            "example": {
                "added": 2,
                "status": "success"
            }
        }
    }


class ParserStatusEnum(str, Enum):
    idle = "idle"
    working = "working"
    unavailable = "unavailable"


class StatusResponse(BaseModel):
    processed_since_last: int
    new_links: int
    in_queue: int
    parser_status: ParserStatusEnum

    model_config = {
        "json_schema_extra": {
            "example": {
                "processed_since_last": 5,
                "new_links": 10,
                "in_queue": 3,
                "parser_status": "working"
            }
        }
    }


class UrlQueueItem(BaseModel):
    url_id: int
    url: HttpUrl
    date_added: datetime
    status: int
    date_modify: Optional[datetime]
    recived: int
    data: Optional[Any]

    model_config = {
        "from_attributes": True,
        "json_schema_extra": {
            "example": {
                "url_id": 1,
                "url": "https://example.com/page1",
                "date_added": "2024-07-07T12:00:00Z",
                "status": 2,
                "date_modify": "2024-07-07T14:00:00Z",
                "recived": 0,
                "data": {
                    "title": "Example Title",
                    "content": "Parsed content here"
                }
            }
        }
    }


class ParsedResultsResponse(BaseModel):
    parsed: List[UrlQueueItem]
    error: List[UrlQueueItem]


    model_config = {
        "json_schema_extra": {
            "example": {
                "results": [
                    {
                        "url_id": 1,
                        "url": "https://example.com/page1",
                        "date_added": "2024-07-07T12:00:00Z",
                        "status": 2,
                        "date_modify": "2024-07-07T14:00:00Z",
                        "recived": 0,
                        "data": {"title": "Example"}
                    }
                ]
            }
        }
    }

class Characteristic(BaseModel):
    group: str
    filter_name: Optional[str]
    value: str


class Cookie(BaseModel):
    name: str
    value: str
    domain: Optional[str]
    path: Optional[str]
    secure: Optional[bool]
    httpOnly: Optional[bool]
    expiry: Optional[int]


class ParsedProductSchema(BaseModel):
    full_name: str
    short_name: str | None = None
    product_description: Optional[str]
    images: List[HttpUrl]
    characteristics: List[Characteristic]

    @field_validator("full_name")
    def check_full_name(cls, v):
        if not v or len(v.strip()) < 2:
            raise ValueError("full_name must be at least 2 characters")
        return v.strip()

class FilterGroup(BaseModel):
    id: int
    name: str
    sort_order: Optional[int] = 0

class Filter(BaseModel):
    id: int
    name: str
    group_id: int

class ProductFilter(BaseModel):
    product_id: int
    filter_id: int

class FilterPayload(BaseModel):
    Category_name: str
    Category_id: int
    FilterGroups: List[FilterGroup]
    Filters: List[Filter]
    Products: List[ProductFilter]