# 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 .user import User
from .course_lecture import CourseLecture
from .course_category import CourseCategory
from .course_channel import CourseChannel
from .visible_scope_info import VisibleScopeInfo
from .lesson import Lesson


class Course(object):
    _types = {
        "id": str,
        "title": str,
        "description": str,
        "cover_url": str,
        "owner": User,
        "teacher_list": List[User],
        "lecture_list": List[CourseLecture],
        "category_list": List[CourseCategory],
        "channel_list": List[CourseChannel],
        "visible_scope_info": VisibleScopeInfo,
        "publish_status": int,
        "created_at": int,
        "published_at": int,
        "total_learner_num": int,
        "vague_total_learner_num": int,
        "unstart_learner_num": int,
        "vague_unstart_learner_num": int,
        "processing_learner_num": int,
        "vague_processing_learner_num": int,
        "completed_learner_num": int,
        "vague_completed_learner_num": int,
        "average_learner_duration": float,
        "avg_rating": float,
        "lesson_list": List[Lesson],
    }

    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.owner: Optional[User] = None
        self.teacher_list: Optional[List[User]] = None
        self.lecture_list: Optional[List[CourseLecture]] = None
        self.category_list: Optional[List[CourseCategory]] = None
        self.channel_list: Optional[List[CourseChannel]] = None
        self.visible_scope_info: Optional[VisibleScopeInfo] = None
        self.publish_status: Optional[int] = None
        self.created_at: Optional[int] = None
        self.published_at: Optional[int] = None
        self.total_learner_num: Optional[int] = None
        self.vague_total_learner_num: Optional[int] = None
        self.unstart_learner_num: Optional[int] = None
        self.vague_unstart_learner_num: Optional[int] = None
        self.processing_learner_num: Optional[int] = None
        self.vague_processing_learner_num: Optional[int] = None
        self.completed_learner_num: Optional[int] = None
        self.vague_completed_learner_num: Optional[int] = None
        self.average_learner_duration: Optional[float] = None
        self.avg_rating: Optional[float] = None
        self.lesson_list: Optional[List[Lesson]] = None
        init(self, d, self._types)

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


class CourseBuilder(object):
    def __init__(self) -> None:
        self._course = Course()

    def id(self, id: str) -> "CourseBuilder":
        self._course.id = id
        return self

    def title(self, title: str) -> "CourseBuilder":
        self._course.title = title
        return self

    def description(self, description: str) -> "CourseBuilder":
        self._course.description = description
        return self

    def cover_url(self, cover_url: str) -> "CourseBuilder":
        self._course.cover_url = cover_url
        return self

    def owner(self, owner: User) -> "CourseBuilder":
        self._course.owner = owner
        return self

    def teacher_list(self, teacher_list: List[User]) -> "CourseBuilder":
        self._course.teacher_list = teacher_list
        return self

    def lecture_list(self, lecture_list: List[CourseLecture]) -> "CourseBuilder":
        self._course.lecture_list = lecture_list
        return self

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

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

    def visible_scope_info(self, visible_scope_info: VisibleScopeInfo) -> "CourseBuilder":
        self._course.visible_scope_info = visible_scope_info
        return self

    def publish_status(self, publish_status: int) -> "CourseBuilder":
        self._course.publish_status = publish_status
        return self

    def created_at(self, created_at: int) -> "CourseBuilder":
        self._course.created_at = created_at
        return self

    def published_at(self, published_at: int) -> "CourseBuilder":
        self._course.published_at = published_at
        return self

    def total_learner_num(self, total_learner_num: int) -> "CourseBuilder":
        self._course.total_learner_num = total_learner_num
        return self

    def vague_total_learner_num(self, vague_total_learner_num: int) -> "CourseBuilder":
        self._course.vague_total_learner_num = vague_total_learner_num
        return self

    def unstart_learner_num(self, unstart_learner_num: int) -> "CourseBuilder":
        self._course.unstart_learner_num = unstart_learner_num
        return self

    def vague_unstart_learner_num(self, vague_unstart_learner_num: int) -> "CourseBuilder":
        self._course.vague_unstart_learner_num = vague_unstart_learner_num
        return self

    def processing_learner_num(self, processing_learner_num: int) -> "CourseBuilder":
        self._course.processing_learner_num = processing_learner_num
        return self

    def vague_processing_learner_num(self, vague_processing_learner_num: int) -> "CourseBuilder":
        self._course.vague_processing_learner_num = vague_processing_learner_num
        return self

    def completed_learner_num(self, completed_learner_num: int) -> "CourseBuilder":
        self._course.completed_learner_num = completed_learner_num
        return self

    def vague_completed_learner_num(self, vague_completed_learner_num: int) -> "CourseBuilder":
        self._course.vague_completed_learner_num = vague_completed_learner_num
        return self

    def average_learner_duration(self, average_learner_duration: float) -> "CourseBuilder":
        self._course.average_learner_duration = average_learner_duration
        return self

    def avg_rating(self, avg_rating: float) -> "CourseBuilder":
        self._course.avg_rating = avg_rating
        return self

    def lesson_list(self, lesson_list: List[Lesson]) -> "CourseBuilder":
        self._course.lesson_list = lesson_list
        return self

    def build(self) -> "Course":
        return self._course
