from pydantic import BaseModel, Field
from typing import Optional
from decimal import Decimal
from src.apps.match.schemas.match_input import MatchInput  # Assuming it's already defined

class MatchOutput(BaseModel):
    wine_db_id: Optional[str] = Field(default=None, alias="wineDbId")
    wine_id: Optional[str] = Field(default="?", alias="wineId")
    wine_name: Optional[str] = Field(default="unknown", alias="wineName")
    match: Optional[str] = "unknown"
    errors: Optional[str] = ""
    bottle_size: Optional[str] = Field(default="", alias="bottleSize")
    vintage: Optional[str] = ""
    price: Optional[Decimal] = None
    tax_status: Optional[str] = Field(default="", alias="taxStatus")
    url: Optional[str] = ""
    description: Optional[str] = ""
    keyword_string: Optional[str] = Field(default="", alias="keywordString")
    original_keyword_string: Optional[str] = Field(default="", alias="originalKeywordString")
    history_string: Optional[str] = Field(default="", alias="historyString")
    original_history_string: Optional[str] = Field(default="", alias="originalHistoryString")
    sku: Optional[str] = ""

    delimiter: Optional[str] = "|"
    input_text: Optional[str] = ""
    input_delimiter: Optional[str] = "\\|"

    class Config:
        allow_population_by_field_name = True
        orm_mode = True

    @classmethod
    def from_input(cls, match_input: MatchInput, output: str, input_delimiter: str = "\\|") -> "MatchOutput":
        return cls(
            bottle_size=match_input.size,
            vintage=match_input.vintage,
            price=match_input.price,
            tax_status=match_input.tax_status,
            url=match_input.url,
            description=match_input.description,
            keyword_string=match_input.keyword_text,
            original_keyword_string=match_input.original_keyword_text,
            history_string=match_input.history_text,
            original_history_string=match_input.original_history_text,
            sku=match_input.sku,
            input_text=output,
            input_delimiter=input_delimiter
        )

    def get_output(self) -> str:
        """
        Returns the formatted match output string.
        Order:
        Wine Id|Wine Name|Match|Errors|Bottle Size|Vintage|Price|Tax Status|URL|Retailer Description|Keyword String|History String|SKU|Input Data
        """
        fields = [
            self.wine_id or "",
            self.wine_name or "",
            self.match or "",
            self.errors or "",
            self.bottle_size or "",
            self.vintage or "",
            str(self.price) if self.price is not None else "",
            self.tax_status or "",
            self.url or "",
            self.description or "",
            self.original_keyword_string or "",
            self.original_history_string or "",
            self.sku or "",
            self._get_original_input()
        ]
        return self.delimiter.join(fields)

    def _get_original_input(self) -> str:
        if self.input_text and self.input_delimiter:
            try:
                return self.input_text.split(self.input_delimiter)
                return self.delimiter.join(self.input_text.split(self.input_delimiter))
            except Exception:
                return self.input_text
        return self.input_text or ""
