from dataclasses import dataclass

from kiutils.items.common import Effects as Effects
from kiutils.items.common import Position as Position
from kiutils.items.common import RenderCache as RenderCache
from kiutils.items.common import Stroke as Stroke
from kiutils.utils.strings import dequote as dequote

@dataclass
class FpText:
    type: str = ...
    text: str = ...
    position: Position = ...
    layer: str = ...
    knockout: bool = ...
    hide: bool = ...
    effects: Effects = ...
    tstamp: str | None = ...
    renderCache: RenderCache | None = ...
    @classmethod
    def from_sexpr(cls, exp: list) -> FpText: ...
    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: ...

@dataclass
class FpLine:
    start: Position = ...
    end: Position = ...
    layer: str = ...
    width: float | None = ...
    stroke: Stroke | None = ...
    locked: bool = ...
    tstamp: str | None = ...
    @classmethod
    def from_sexpr(cls, exp: list) -> FpLine: ...
    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: ...

@dataclass
class FpRect:
    start: Position = ...
    end: Position = ...
    layer: str = ...
    width: float | None = ...
    stroke: Stroke | None = ...
    fill: str | None = ...
    locked: bool = ...
    tstamp: str | None = ...
    @classmethod
    def from_sexpr(cls, exp: list) -> FpRect: ...
    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: ...

@dataclass
class FpTextBox:
    locked: bool = ...
    text: str = ...
    start: Position | None = ...
    end: Position | None = ...
    pts: list[Position] = ...
    angle: float | None = ...
    layer: str = ...
    tstamp: str | None = ...
    effects: Effects | None = ...
    stroke: Stroke | None = ...
    renderCache: RenderCache | None = ...
    @classmethod
    def from_sexpr(cls, exp: list) -> FpTextBox: ...
    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: ...

@dataclass
class FpCircle:
    center: Position = ...
    end: Position = ...
    layer: str = ...
    width: float | None = ...
    stroke: Stroke | None = ...
    fill: str | None = ...
    locked: bool = ...
    tstamp: str | None = ...
    @classmethod
    def from_sexpr(cls, exp: list) -> FpCircle: ...
    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: ...

@dataclass
class FpArc:
    start: Position = ...
    mid: Position = ...
    end: Position = ...
    layer: str = ...
    width: float | None = ...
    stroke: Stroke | None = ...
    locked: bool = ...
    tstamp: str | None = ...
    @classmethod
    def from_sexpr(cls, exp: list) -> FpArc: ...
    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: ...

@dataclass
class FpPoly:
    layer: str = ...
    coordinates: list[Position] = ...
    width: float | None = ...
    stroke: Stroke | None = ...
    fill: str | None = ...
    locked: bool = ...
    tstamp: str | None = ...
    @classmethod
    def from_sexpr(cls, exp: list) -> FpPoly: ...
    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: ...

@dataclass
class FpCurve:
    coordinates: list[Position] = ...
    layer: str = ...
    width: float | None = ...
    stroke: Stroke | None = ...
    locked: bool = ...
    tstamp: str | None = ...
    @classmethod
    def from_sexpr(cls, exp: list) -> FpCurve: ...
    def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: ...
