"""
Spreadsheet models with self-parsing from Google Sheets API responses.
"""

from pydantic import BaseModel
from typing import Optional, List


class SheetInfo(BaseModel):
    """Individual sheet within a spreadsheet."""
    title: str
    sheet_id: int
    index: int
    row_count: int
    column_count: int


class SpreadsheetMetadata(BaseModel):
    """Spreadsheet metadata."""
    spreadsheet_id: str
    title: str
    locale: Optional[str] = None
    timezone: Optional[str] = None
    sheets: List[SheetInfo] = []

    @classmethod
    def from_google(cls, data: dict) -> "SpreadsheetMetadata":
        """Parse from Google Sheets API response."""
        sheets = [
            SheetInfo(
                title=sheet["properties"]["title"],
                sheet_id=sheet["properties"]["sheetId"],
                index=sheet["properties"]["index"],
                row_count=sheet["properties"]["gridProperties"].get("rowCount", 0),
                column_count=sheet["properties"]["gridProperties"].get("columnCount", 0),
            )
            for sheet in data.get("sheets", [])
        ]

        return cls(
            spreadsheet_id=data["spreadsheetId"],
            title=data["properties"]["title"],
            locale=data["properties"].get("locale"),
            timezone=data["properties"].get("timeZone"),
            sheets=sheets,
        )


class SheetValues(BaseModel):
    """Sheet data values."""
    spreadsheet_id: str
    range: str
    values: List[List[str]]  # rows of cells
    row_count: int
    column_count: int

    @classmethod
    def from_google(cls, spreadsheet_id: str, range_name: str, values: List[List]) -> "SheetValues":
        """Parse from Google Sheets API values response."""
        row_count = len(values)
        column_count = max((len(row) for row in values), default=0)

        return cls(
            spreadsheet_id=spreadsheet_id,
            range=range_name,
            values=values,
            row_count=row_count,
            column_count=column_count,
        )
