from datetime import datetime
from typing import List, Optional

from fastapi import File as FastAPIFile
from fastapi import UploadFile
from pydantic import BaseModel, Field, computed_field
from src.apps.base.schemas.common import BaseSchema
from decimal import Decimal

class RollupLogBase(BaseSchema):
    status: Optional[str] = None
    date_start: Optional[datetime] = None
    date_end: Optional[datetime] = None
    message: Optional[str] = None
    file_name: Optional[str] = None
    rollup_type: Optional[str] = None
    
class RollupLogCreate(RollupLogBase):
    pass

class RollupLogUpdate(RollupLogBase):
    pass

class RollupLogResponse(RollupLogBase):
    id: Optional[int] = None
    created_at: Optional[datetime] = None
    updated_at: Optional[datetime] = None
    
class RollupLogFilterSchema(BaseModel):
    rollup_type: Optional[str] = None
    

class RollupOutput(BaseSchema):
    wine_alert_id: Optional[str] = None
    wine_id: Optional[str] = None
    vintage: Optional[str] = None
    bottle_size: Optional[str] = None
    retailer: Optional[str] = None
    price: Optional[Decimal] = None
    currency: Optional[str] = None
    tax_notes: Optional[str] = None
    wine_url: Optional[str] = None
    actual_retailer_description: Optional[str] = None
    override_price: Optional[str] = None
    auction: Optional[str] = None
    retailer_name: Optional[str] = None
    address: Optional[str] = None
    city: Optional[str] = None
    state: Optional[str] = None
    zip: Optional[str] = None
    country: Optional[str] = None
    ship_to_country: Optional[str] = None
    phone: Optional[str] = None
    url: Optional[str] = None
    listing: Optional[bool] = None
    download: Optional[bool] = None
    your_code: Optional[str] = None
    equalized_price: Optional[Decimal] = None
    original_price: Optional[Decimal] = None
    
    def to_string(self, separator: str, rollup_type: str) -> str:
        """
        Convert the RollupOutput object to a string representation for file output.
        
        Args:
            separator (str): The separator to use between fields.
            rollup_type (str): The type of rollup (RP, WA, etc.).
            
        Returns:
            str: String representation of the rollup output.
        """
        sb = []
        sb.append(self.wine_alert_id or "")
        sb.append(self.wine_id or "")
        sb.append(self.vintage or "")
        sb.append(self.bottle_size or "")
        sb.append(self.retailer or "")
        sb.append(str(self.price) if self.price is not None else "")
        sb.append(self.currency or "")
        sb.append(self.tax_notes or "")
        sb.append(self.wine_url or "")
        sb.append(self.actual_retailer_description or "")
        sb.append(self.override_price or "")
        sb.append(self.auction or "")
        sb.append(self.retailer_name or "")
        sb.append(self.address or "")
        sb.append(self.city or "")
        sb.append(self.state or "")
        sb.append(self.zip or "")
        sb.append(self.country or "")
        sb.append(self.ship_to_country or "")
        sb.append(self.phone or "")
        sb.append(self.url or "")
        sb.append(str(self.listing) if self.listing is not None else "")
        sb.append(str(self.download) if self.download is not None else "")
        sb.append(self.your_code or "")
        
        if rollup_type == "WA":
            sb.append(str(self.equalized_price) if self.equalized_price is not None else "")
        
        return separator.join(sb)
