# Code generated by Lark OpenAPI.

from typing import Any, Optional, Union, Dict, List, Set, IO, Callable, Type
from lark_oapi.core.construct import init
from .border_radius import BorderRadius
from .shadow import Shadow
from .shadow import Shadow
from .fill_gradient import FillGradient


class Style(object):
    _types = {
        "fill_color": str,
        "fill_opacity": float,
        "border_style": str,
        "border_width": str,
        "border_opacity": float,
        "h_flip": bool,
        "v_flip": bool,
        "border_color": str,
        "theme_fill_color_code": int,
        "theme_border_color_code": int,
        "fill_color_type": int,
        "border_color_type": int,
        "border_dasharrays": List[int],
        "border_radius": BorderRadius,
        "shadow": Shadow,
        "inner_shadow": Shadow,
        "fill_gradient": FillGradient,
    }

    def __init__(self, d=None):
        self.fill_color: Optional[str] = None
        self.fill_opacity: Optional[float] = None
        self.border_style: Optional[str] = None
        self.border_width: Optional[str] = None
        self.border_opacity: Optional[float] = None
        self.h_flip: Optional[bool] = None
        self.v_flip: Optional[bool] = None
        self.border_color: Optional[str] = None
        self.theme_fill_color_code: Optional[int] = None
        self.theme_border_color_code: Optional[int] = None
        self.fill_color_type: Optional[int] = None
        self.border_color_type: Optional[int] = None
        self.border_dasharrays: Optional[List[int]] = None
        self.border_radius: Optional[BorderRadius] = None
        self.shadow: Optional[Shadow] = None
        self.inner_shadow: Optional[Shadow] = None
        self.fill_gradient: Optional[FillGradient] = None
        init(self, d, self._types)

    @staticmethod
    def builder() -> "StyleBuilder":
        return StyleBuilder()


class StyleBuilder(object):
    def __init__(self) -> None:
        self._style = Style()

    def fill_color(self, fill_color: str) -> "StyleBuilder":
        self._style.fill_color = fill_color
        return self

    def fill_opacity(self, fill_opacity: float) -> "StyleBuilder":
        self._style.fill_opacity = fill_opacity
        return self

    def border_style(self, border_style: str) -> "StyleBuilder":
        self._style.border_style = border_style
        return self

    def border_width(self, border_width: str) -> "StyleBuilder":
        self._style.border_width = border_width
        return self

    def border_opacity(self, border_opacity: float) -> "StyleBuilder":
        self._style.border_opacity = border_opacity
        return self

    def h_flip(self, h_flip: bool) -> "StyleBuilder":
        self._style.h_flip = h_flip
        return self

    def v_flip(self, v_flip: bool) -> "StyleBuilder":
        self._style.v_flip = v_flip
        return self

    def border_color(self, border_color: str) -> "StyleBuilder":
        self._style.border_color = border_color
        return self

    def theme_fill_color_code(self, theme_fill_color_code: int) -> "StyleBuilder":
        self._style.theme_fill_color_code = theme_fill_color_code
        return self

    def theme_border_color_code(self, theme_border_color_code: int) -> "StyleBuilder":
        self._style.theme_border_color_code = theme_border_color_code
        return self

    def fill_color_type(self, fill_color_type: int) -> "StyleBuilder":
        self._style.fill_color_type = fill_color_type
        return self

    def border_color_type(self, border_color_type: int) -> "StyleBuilder":
        self._style.border_color_type = border_color_type
        return self

    def border_dasharrays(self, border_dasharrays: List[int]) -> "StyleBuilder":
        self._style.border_dasharrays = border_dasharrays
        return self

    def border_radius(self, border_radius: BorderRadius) -> "StyleBuilder":
        self._style.border_radius = border_radius
        return self

    def shadow(self, shadow: Shadow) -> "StyleBuilder":
        self._style.shadow = shadow
        return self

    def inner_shadow(self, inner_shadow: Shadow) -> "StyleBuilder":
        self._style.inner_shadow = inner_shadow
        return self

    def fill_gradient(self, fill_gradient: FillGradient) -> "StyleBuilder":
        self._style.fill_gradient = fill_gradient
        return self

    def build(self) -> "Style":
        return self._style
