# 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 .course_category import CourseCategory
from .course_channel import CourseChannel
from .session import Session


class Training(object):
    _types = {
        "id": str,
        "title": str,
        "description": str,
        "cover_url": str,
        "category_list": List[CourseCategory],
        "channel_list": List[CourseChannel],
        "session_list": List[Session],
        "session_limit": int,
    }

    def __init__(self, d=None):
        self.id: Optional[str] = None
        self.title: Optional[str] = None
        self.description: Optional[str] = None
        self.cover_url: Optional[str] = None
        self.category_list: Optional[List[CourseCategory]] = None
        self.channel_list: Optional[List[CourseChannel]] = None
        self.session_list: Optional[List[Session]] = None
        self.session_limit: Optional[int] = None
        init(self, d, self._types)

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


class TrainingBuilder(object):
    def __init__(self) -> None:
        self._training = Training()

    def id(self, id: str) -> "TrainingBuilder":
        self._training.id = id
        return self

    def title(self, title: str) -> "TrainingBuilder":
        self._training.title = title
        return self

    def description(self, description: str) -> "TrainingBuilder":
        self._training.description = description
        return self

    def cover_url(self, cover_url: str) -> "TrainingBuilder":
        self._training.cover_url = cover_url
        return self

    def category_list(self, category_list: List[CourseCategory]) -> "TrainingBuilder":
        self._training.category_list = category_list
        return self

    def channel_list(self, channel_list: List[CourseChannel]) -> "TrainingBuilder":
        self._training.channel_list = channel_list
        return self

    def session_list(self, session_list: List[Session]) -> "TrainingBuilder":
        self._training.session_list = session_list
        return self

    def session_limit(self, session_limit: int) -> "TrainingBuilder":
        self._training.session_limit = session_limit
        return self

    def build(self) -> "Training":
        return self._training
