# 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 .schema_sort_options import SchemaSortOptions
from .schema_type_definitions import SchemaTypeDefinitions
from .schema_search_options import SchemaSearchOptions
from .schema_filter_options import SchemaFilterOptions
from .schema_field_answer_option import SchemaFieldAnswerOption


class SchemaProperty(object):
    _types = {
        "name": str,
        "type": str,
        "is_searchable": bool,
        "is_sortable": bool,
        "is_returnable": bool,
        "sort_options": SchemaSortOptions,
        "type_definitions": SchemaTypeDefinitions,
        "search_options": SchemaSearchOptions,
        "is_filterable": bool,
        "filter_options": SchemaFilterOptions,
        "answer_option": SchemaFieldAnswerOption,
        "desc": str,
    }

    def __init__(self, d=None):
        self.name: Optional[str] = None
        self.type: Optional[str] = None
        self.is_searchable: Optional[bool] = None
        self.is_sortable: Optional[bool] = None
        self.is_returnable: Optional[bool] = None
        self.sort_options: Optional[SchemaSortOptions] = None
        self.type_definitions: Optional[SchemaTypeDefinitions] = None
        self.search_options: Optional[SchemaSearchOptions] = None
        self.is_filterable: Optional[bool] = None
        self.filter_options: Optional[SchemaFilterOptions] = None
        self.answer_option: Optional[SchemaFieldAnswerOption] = None
        self.desc: Optional[str] = None
        init(self, d, self._types)

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


class SchemaPropertyBuilder(object):
    def __init__(self) -> None:
        self._schema_property = SchemaProperty()

    def name(self, name: str) -> "SchemaPropertyBuilder":
        self._schema_property.name = name
        return self

    def type(self, type: str) -> "SchemaPropertyBuilder":
        self._schema_property.type = type
        return self

    def is_searchable(self, is_searchable: bool) -> "SchemaPropertyBuilder":
        self._schema_property.is_searchable = is_searchable
        return self

    def is_sortable(self, is_sortable: bool) -> "SchemaPropertyBuilder":
        self._schema_property.is_sortable = is_sortable
        return self

    def is_returnable(self, is_returnable: bool) -> "SchemaPropertyBuilder":
        self._schema_property.is_returnable = is_returnable
        return self

    def sort_options(self, sort_options: SchemaSortOptions) -> "SchemaPropertyBuilder":
        self._schema_property.sort_options = sort_options
        return self

    def type_definitions(self, type_definitions: SchemaTypeDefinitions) -> "SchemaPropertyBuilder":
        self._schema_property.type_definitions = type_definitions
        return self

    def search_options(self, search_options: SchemaSearchOptions) -> "SchemaPropertyBuilder":
        self._schema_property.search_options = search_options
        return self

    def is_filterable(self, is_filterable: bool) -> "SchemaPropertyBuilder":
        self._schema_property.is_filterable = is_filterable
        return self

    def filter_options(self, filter_options: SchemaFilterOptions) -> "SchemaPropertyBuilder":
        self._schema_property.filter_options = filter_options
        return self

    def answer_option(self, answer_option: SchemaFieldAnswerOption) -> "SchemaPropertyBuilder":
        self._schema_property.answer_option = answer_option
        return self

    def desc(self, desc: str) -> "SchemaPropertyBuilder":
        self._schema_property.desc = desc
        return self

    def build(self) -> "SchemaProperty":
        return self._schema_property
