# 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 .user import User
from .course_category import CourseCategory
from .visible_scope_info import VisibleScopeInfo
from .stage_info import StageInfo


class TrainProgram(object):
    _types = {
        "id": str,
        "title": str,
        "description": str,
        "cover_link": str,
        "owner": User,
        "category_list": List[CourseCategory],
        "visible_scope_info": VisibleScopeInfo,
        "created_at": int,
        "published_at": int,
        "publish_status": int,
        "total_learner_num": int,
        "vague_total_learner_num": int,
        "learning_learner_num": int,
        "vague_learning_learner_num": int,
        "completed_learner_num": int,
        "vague_completed_learner_num": int,
        "score": float,
        "stage_list": List[StageInfo],
    }

    def __init__(self, d=None):
        self.id: Optional[str] = None
        self.title: Optional[str] = None
        self.description: Optional[str] = None
        self.cover_link: Optional[str] = None
        self.owner: Optional[User] = None
        self.category_list: Optional[List[CourseCategory]] = None
        self.visible_scope_info: Optional[VisibleScopeInfo] = None
        self.created_at: Optional[int] = None
        self.published_at: Optional[int] = None
        self.publish_status: Optional[int] = None
        self.total_learner_num: Optional[int] = None
        self.vague_total_learner_num: Optional[int] = None
        self.learning_learner_num: Optional[int] = None
        self.vague_learning_learner_num: Optional[int] = None
        self.completed_learner_num: Optional[int] = None
        self.vague_completed_learner_num: Optional[int] = None
        self.score: Optional[float] = None
        self.stage_list: Optional[List[StageInfo]] = None
        init(self, d, self._types)

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


class TrainProgramBuilder(object):
    def __init__(self) -> None:
        self._train_program = TrainProgram()

    def id(self, id: str) -> "TrainProgramBuilder":
        self._train_program.id = id
        return self

    def title(self, title: str) -> "TrainProgramBuilder":
        self._train_program.title = title
        return self

    def description(self, description: str) -> "TrainProgramBuilder":
        self._train_program.description = description
        return self

    def cover_link(self, cover_link: str) -> "TrainProgramBuilder":
        self._train_program.cover_link = cover_link
        return self

    def owner(self, owner: User) -> "TrainProgramBuilder":
        self._train_program.owner = owner
        return self

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

    def visible_scope_info(self, visible_scope_info: VisibleScopeInfo) -> "TrainProgramBuilder":
        self._train_program.visible_scope_info = visible_scope_info
        return self

    def created_at(self, created_at: int) -> "TrainProgramBuilder":
        self._train_program.created_at = created_at
        return self

    def published_at(self, published_at: int) -> "TrainProgramBuilder":
        self._train_program.published_at = published_at
        return self

    def publish_status(self, publish_status: int) -> "TrainProgramBuilder":
        self._train_program.publish_status = publish_status
        return self

    def total_learner_num(self, total_learner_num: int) -> "TrainProgramBuilder":
        self._train_program.total_learner_num = total_learner_num
        return self

    def vague_total_learner_num(self, vague_total_learner_num: int) -> "TrainProgramBuilder":
        self._train_program.vague_total_learner_num = vague_total_learner_num
        return self

    def learning_learner_num(self, learning_learner_num: int) -> "TrainProgramBuilder":
        self._train_program.learning_learner_num = learning_learner_num
        return self

    def vague_learning_learner_num(self, vague_learning_learner_num: int) -> "TrainProgramBuilder":
        self._train_program.vague_learning_learner_num = vague_learning_learner_num
        return self

    def completed_learner_num(self, completed_learner_num: int) -> "TrainProgramBuilder":
        self._train_program.completed_learner_num = completed_learner_num
        return self

    def vague_completed_learner_num(self, vague_completed_learner_num: int) -> "TrainProgramBuilder":
        self._train_program.vague_completed_learner_num = vague_completed_learner_num
        return self

    def score(self, score: float) -> "TrainProgramBuilder":
        self._train_program.score = score
        return self

    def stage_list(self, stage_list: List[StageInfo]) -> "TrainProgramBuilder":
        self._train_program.stage_list = stage_list
        return self

    def build(self) -> "TrainProgram":
        return self._train_program
