from app.util.tools import obfuscate_data
from pydantic import BaseModel, model_validator
from typing_extensions import Self
 
 
from abc import ABC, abstractmethod
from typing import Literal, Union
 
 
class RequestAddPostBase(BaseModel, ABC):
    type: Literal["ig", "nb"]
 
    @abstractmethod
    def to_key(self) -> str:
        """
        Convert request to key for DB
        """
        pass
 
 
class RequestAddNaverPost(RequestAddPostBase):
    type: Literal["nb"]
    post_id: str
    author_id: str
 
    @model_validator(mode="after")
    def validate_input(self) -> Self:
        if not self.post_id.isdigit():
            raise ValueError("post_id must be numeric")
        return self
 
    def to_key(self) -> str:
        return f"nb-{obfuscate_data(self.post_id + self.author_id)}"
 
 
class RequestAddInstagramPost(RequestAddPostBase):
    type: Literal["ig"]
    post_id: str
 
    @model_validator(mode="after")
    def validate_input(self) -> Self:
        if len(self.post_id) > 12:
            raise ValueError("Invalid post_id")
        return self
 
    def to_key(self) -> str:
        return f"ig-{self.post_id}"
 
 
RequestAddPost = Union[RequestAddInstagramPost, RequestAddNaverPost]
 
 
 
 
 
 
async def add_post(
    request: RequestAddPost = Body(..., discriminator="type"),
) -> GeneralResponse:

discriminator 를 사용하면 된다. type 에 맞게 알아서 request의 타입이 바뀜