from __future__ import annotations

from dataclasses import dataclass, field
from typing import Any, Dict, List, Optional, Union


@dataclass
class IDExportRun:
    text: str
    style: Optional[str]
    bold: bool
    italic: bool
    color_hex: Optional[str]
    font: Optional[str]
    size_pt: Optional[float]


@dataclass
class IDExportParagraph:
    style: str
    text: str
    runs: List[IDExportRun] = field(default_factory=list)


@dataclass
class IDExportTextFrame:
    id: str
    thread_id: str
    thread_position: int
    x_pt: float
    y_pt: float
    width_pt: float
    height_pt: float
    column_count: int
    paragraphs: List[IDExportParagraph] = field(default_factory=list)
    type: str = 'text_frame'


@dataclass
class IDExportImageFrame:
    id: str
    x_pt: float
    y_pt: float
    width_pt: float
    height_pt: float
    image_name: str
    image_data_b64: Optional[str]
    fit_mode: str
    type: str = 'image_frame'


@dataclass
class IDExportShape:
    id: str
    x_pt: float
    y_pt: float
    width_pt: float
    height_pt: float
    shape_type: str          # 'rect' | 'ellipse' | 'line'
    fill_hex: Optional[str]
    stroke_hex: Optional[str]
    stroke_weight_pt: float
    type: str = 'shape'


@dataclass
class IDExportTableCell:
    text: str
    style: Optional[str]
    col_span: int
    row_span: int
    background_hex: Optional[str]
    text_color_hex: Optional[str]


@dataclass
class IDExportTableRow:
    is_header: bool
    cells: List[IDExportTableCell] = field(default_factory=list)


@dataclass
class IDExportTable:
    id: str
    x_pt: float
    y_pt: float
    width_pt: float
    column_widths_pt: List[float]
    rows: List[IDExportTableRow] = field(default_factory=list)
    type: str = 'table'


@dataclass
class IDExportPageNumber:
    id: str
    x_pt: float
    y_pt: float
    font: Optional[str]
    size_pt: float
    color_hex: str
    alignment: str
    type: str = 'page_number'


@dataclass
class IDExportParagraphStyle:
    name: str
    font: Optional[str] = None
    size_pt: Optional[float] = None
    leading_pt: Optional[float] = None
    space_before_pt: float = 0.0
    space_after_pt: float = 0.0
    alignment: str = 'left'
    color_hex: Optional[str] = None
    bold: bool = False
    italic: bool = False


@dataclass
class IDExportCharacterStyle:
    name: str
    font: Optional[str] = None
    bold: bool = False
    italic: bool = False
    color_hex: Optional[str] = None


@dataclass
class IDExportPage:
    page_number: Union[int, str]
    width_pt: float
    height_pt: float
    items: List[Any] = field(default_factory=list)


@dataclass
class IDExportDocument:
    name: str
    page_width_pt: float
    page_height_pt: float
    page_count: int
    facing_pages: bool
    paragraph_styles: List[IDExportParagraphStyle]
    character_styles: List[IDExportCharacterStyle]
    colors: Dict[str, str]
    fonts_used: List[Dict[str, str]]
    pages: List[IDExportPage]
    page_number_style: Optional[IDExportPageNumber] = None
