from pydantic import BaseModel, model_validator
from typing import Optional, List
from datetime import datetime, date, time
from src.marketing.apps.Account.schema import ConnectedAccountOut
from enum import Enum


# ------------------------------
# CalendarPostType Schemas
# ------------------------------


class PostImageOut(BaseModel):
    id: Optional[int] = None
    image_url: Optional[str] = None
    image_name: Optional[str] = None 

    class Config:
        from_attributes = True




class CalendarPostTypeBase(BaseModel):
    store_id: Optional[int] = None
    branch_id: Optional[int] = None
    user_id: Optional[int] = None
    calendar_id: Optional[int] = None
    calendar_post_id: Optional[int] = None
    connected_account_id: Optional[int] = None
    post_type: Optional[str] = None
    content: Optional[str] = None
    images: Optional[List[int]] = None
    link: Optional[str] = None
    is_instant_post: Optional[bool] = False

class CalendarPostTypeCreate(CalendarPostTypeBase):
    pass

class CalendarPostTypeOut(CalendarPostTypeBase):
    id: int
    calendar_id: Optional[int] = None 
    branch_id: Optional[int] = None
    created_at: datetime
    updated_at: datetime
    images: List[PostImageOut] = [] 
    connected_account: Optional[ConnectedAccountOut] = None

    class Config:
        from_attributes = True
class CalendarPostTypeUpdate(CalendarPostTypeBase):
    connected_account_id: Optional[int] = None
    post_type: Optional[str] = None
    content: Optional[str] = None
    images: Optional[List[int]] = None
    link: Optional[str] = None
    is_instant_post: Optional[bool] = None

    class Config:
        from_attributes = True
        orm_mode = True


# ------------------------------
# CalendarPost Schemas
# ------------------------------

class CalendarPostBase(BaseModel):
    store_id: Optional[int] = None
    branch_id: Optional[int] = None
    user_id: Optional[int] = None
    calendar_id: Optional[int] = None
    title: str
    schedule_date: date
    schedule_time: Optional[time] = None
    post_status: Optional[str] = None
    tags: Optional[str] = None
    is_instant_post: Optional[bool] = False

class CalendarPostCreate(CalendarPostBase):
    pass

class CalendarPostOut(CalendarPostBase):
    id: int
    calendar_id: Optional[int] = None
    branch_id: Optional[int] = None
    created_at: datetime
    updated_at: datetime
    post_types: List[CalendarPostTypeOut] = []

    class Config:
        from_attributes = True

class CalendarPostUpdate(CalendarPostBase):
    title: Optional[str] = None
    calendar_id: Optional[int] = None
    schedule_date: Optional[date] = None
    schedule_time: Optional[time] = None
    post_status: Optional[str] = None
    tags: Optional[str] = None
    is_instant_post: Optional[bool] = None

    class Config:
        from_attributes = True
        orm_mode = True


# --------------------------------------------
# Generate social media post content schema
# --------------------------------------------

    
class GenerateImageContent(BaseModel):
    input_text: str
    post_type: str
    post_id: Optional[int]=None
    post_type_id: Optional[int]=None
    
    supports_image: Optional[bool] = True
    supports_multiple_images: Optional[bool] = False
    image_ratio: Optional[str] = None
    image_best_resolution_px: Optional[str] = None
    num_images: Optional[int]=1


class GenerateTextContent(BaseModel):
    input_text: str
    post_type: str
    supports_text: Optional[bool] = True
    text_max_limit: Optional[int] = None
    text_optimum_limit: Optional[int] = None



class GeneratedTextResponse(BaseModel):
    generated_text: str

class GeneratedImage(BaseModel):
    id: Optional[int] = None
    image_url: str
    image_name: str

class GeneratedImageResponse(BaseModel):
    generated_images: list[GeneratedImage]



###--------------------------------------------------------------------------------------------|
# Get URL information find
###--------------------------------------------------------------------------------------------|
class URLInfoRequest(BaseModel):
    url: str

class URLInfoResponse(BaseModel):
    # url: str
    title: str | None
    meta_description: str | None
    # meta_keywords: str | None
    # headers: dict | None
    # http_headers: dict | None
    # domain_info: dict | None
    # error: str | None
    

