# 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 .department_count import DepartmentCount
from .department_leader import DepartmentLeader
from .i18n_text import I18nText
from .i18n_text import I18nText
from .custom_field_value import CustomFieldValue
from .department_base_info import DepartmentBaseInfo


class Department(object):
    _types = {
        "department_id": str,
        "tenant_id": str,
        "external_id": str,
        "encrypted_id": str,
        "department_count": DepartmentCount,
        "has_child": bool,
        "leaders": List[DepartmentLeader],
        "hrbps": List[str],
        "parent_department_id": str,
        "name": I18nText,
        "delete_status": int,
        "enabled_status": bool,
        "order_weight": str,
        "type": int,
        "description": I18nText,
        "create_time": str,
        "update_time": str,
        "creator_id": str,
        "updator_id": str,
        "is_root": bool,
        "custom_field_values": List[CustomFieldValue],
        "department_paths": List[str],
        "department_path_infos": List[DepartmentBaseInfo],
        "data_source": int,
        "org_dimension": str,
    }

    def __init__(self, d=None):
        self.department_id: Optional[str] = None
        self.tenant_id: Optional[str] = None
        self.external_id: Optional[str] = None
        self.encrypted_id: Optional[str] = None
        self.department_count: Optional[DepartmentCount] = None
        self.has_child: Optional[bool] = None
        self.leaders: Optional[List[DepartmentLeader]] = None
        self.hrbps: Optional[List[str]] = None
        self.parent_department_id: Optional[str] = None
        self.name: Optional[I18nText] = None
        self.delete_status: Optional[int] = None
        self.enabled_status: Optional[bool] = None
        self.order_weight: Optional[str] = None
        self.type: Optional[int] = None
        self.description: Optional[I18nText] = None
        self.create_time: Optional[str] = None
        self.update_time: Optional[str] = None
        self.creator_id: Optional[str] = None
        self.updator_id: Optional[str] = None
        self.is_root: Optional[bool] = None
        self.custom_field_values: Optional[List[CustomFieldValue]] = None
        self.department_paths: Optional[List[str]] = None
        self.department_path_infos: Optional[List[DepartmentBaseInfo]] = None
        self.data_source: Optional[int] = None
        self.org_dimension: Optional[str] = None
        init(self, d, self._types)

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


class DepartmentBuilder(object):
    def __init__(self) -> None:
        self._department = Department()

    def department_id(self, department_id: str) -> "DepartmentBuilder":
        self._department.department_id = department_id
        return self

    def tenant_id(self, tenant_id: str) -> "DepartmentBuilder":
        self._department.tenant_id = tenant_id
        return self

    def external_id(self, external_id: str) -> "DepartmentBuilder":
        self._department.external_id = external_id
        return self

    def encrypted_id(self, encrypted_id: str) -> "DepartmentBuilder":
        self._department.encrypted_id = encrypted_id
        return self

    def department_count(self, department_count: DepartmentCount) -> "DepartmentBuilder":
        self._department.department_count = department_count
        return self

    def has_child(self, has_child: bool) -> "DepartmentBuilder":
        self._department.has_child = has_child
        return self

    def leaders(self, leaders: List[DepartmentLeader]) -> "DepartmentBuilder":
        self._department.leaders = leaders
        return self

    def hrbps(self, hrbps: List[str]) -> "DepartmentBuilder":
        self._department.hrbps = hrbps
        return self

    def parent_department_id(self, parent_department_id: str) -> "DepartmentBuilder":
        self._department.parent_department_id = parent_department_id
        return self

    def name(self, name: I18nText) -> "DepartmentBuilder":
        self._department.name = name
        return self

    def delete_status(self, delete_status: int) -> "DepartmentBuilder":
        self._department.delete_status = delete_status
        return self

    def enabled_status(self, enabled_status: bool) -> "DepartmentBuilder":
        self._department.enabled_status = enabled_status
        return self

    def order_weight(self, order_weight: str) -> "DepartmentBuilder":
        self._department.order_weight = order_weight
        return self

    def type(self, type: int) -> "DepartmentBuilder":
        self._department.type = type
        return self

    def description(self, description: I18nText) -> "DepartmentBuilder":
        self._department.description = description
        return self

    def create_time(self, create_time: str) -> "DepartmentBuilder":
        self._department.create_time = create_time
        return self

    def update_time(self, update_time: str) -> "DepartmentBuilder":
        self._department.update_time = update_time
        return self

    def creator_id(self, creator_id: str) -> "DepartmentBuilder":
        self._department.creator_id = creator_id
        return self

    def updator_id(self, updator_id: str) -> "DepartmentBuilder":
        self._department.updator_id = updator_id
        return self

    def is_root(self, is_root: bool) -> "DepartmentBuilder":
        self._department.is_root = is_root
        return self

    def custom_field_values(self, custom_field_values: List[CustomFieldValue]) -> "DepartmentBuilder":
        self._department.custom_field_values = custom_field_values
        return self

    def department_paths(self, department_paths: List[str]) -> "DepartmentBuilder":
        self._department.department_paths = department_paths
        return self

    def department_path_infos(self, department_path_infos: List[DepartmentBaseInfo]) -> "DepartmentBuilder":
        self._department.department_path_infos = department_path_infos
        return self

    def data_source(self, data_source: int) -> "DepartmentBuilder":
        self._department.data_source = data_source
        return self

    def org_dimension(self, org_dimension: str) -> "DepartmentBuilder":
        self._department.org_dimension = org_dimension
        return self

    def build(self) -> "Department":
        return self._department
