# 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 .completion_condition import CompletionCondition


class Session(object):
    _types = {
        "duration": int,
        "learner_num": int,
        "vague_learner_num": int,
        "sign_in_num": int,
        "vague_sign_in_num": int,
        "instructor_list": List[User],
        "session_id": str,
        "start_at": int,
        "end_at": int,
        "start_date": str,
        "timezone": str,
        "enroll_rule": int,
        "enroll_offset": int,
        "enroll_start_at": int,
        "enroll_end_at": int,
        "address": str,
        "enable_live": bool,
        "meeting_type": int,
        "playback_type": int,
        "playback_url": str,
        "completion_condition": CompletionCondition,
        "enroll_limit": int,
    }

    def __init__(self, d=None):
        self.duration: Optional[int] = None
        self.learner_num: Optional[int] = None
        self.vague_learner_num: Optional[int] = None
        self.sign_in_num: Optional[int] = None
        self.vague_sign_in_num: Optional[int] = None
        self.instructor_list: Optional[List[User]] = None
        self.session_id: Optional[str] = None
        self.start_at: Optional[int] = None
        self.end_at: Optional[int] = None
        self.start_date: Optional[str] = None
        self.timezone: Optional[str] = None
        self.enroll_rule: Optional[int] = None
        self.enroll_offset: Optional[int] = None
        self.enroll_start_at: Optional[int] = None
        self.enroll_end_at: Optional[int] = None
        self.address: Optional[str] = None
        self.enable_live: Optional[bool] = None
        self.meeting_type: Optional[int] = None
        self.playback_type: Optional[int] = None
        self.playback_url: Optional[str] = None
        self.completion_condition: Optional[CompletionCondition] = None
        self.enroll_limit: Optional[int] = None
        init(self, d, self._types)

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


class SessionBuilder(object):
    def __init__(self) -> None:
        self._session = Session()

    def duration(self, duration: int) -> "SessionBuilder":
        self._session.duration = duration
        return self

    def learner_num(self, learner_num: int) -> "SessionBuilder":
        self._session.learner_num = learner_num
        return self

    def vague_learner_num(self, vague_learner_num: int) -> "SessionBuilder":
        self._session.vague_learner_num = vague_learner_num
        return self

    def sign_in_num(self, sign_in_num: int) -> "SessionBuilder":
        self._session.sign_in_num = sign_in_num
        return self

    def vague_sign_in_num(self, vague_sign_in_num: int) -> "SessionBuilder":
        self._session.vague_sign_in_num = vague_sign_in_num
        return self

    def instructor_list(self, instructor_list: List[User]) -> "SessionBuilder":
        self._session.instructor_list = instructor_list
        return self

    def session_id(self, session_id: str) -> "SessionBuilder":
        self._session.session_id = session_id
        return self

    def start_at(self, start_at: int) -> "SessionBuilder":
        self._session.start_at = start_at
        return self

    def end_at(self, end_at: int) -> "SessionBuilder":
        self._session.end_at = end_at
        return self

    def start_date(self, start_date: str) -> "SessionBuilder":
        self._session.start_date = start_date
        return self

    def timezone(self, timezone: str) -> "SessionBuilder":
        self._session.timezone = timezone
        return self

    def enroll_rule(self, enroll_rule: int) -> "SessionBuilder":
        self._session.enroll_rule = enroll_rule
        return self

    def enroll_offset(self, enroll_offset: int) -> "SessionBuilder":
        self._session.enroll_offset = enroll_offset
        return self

    def enroll_start_at(self, enroll_start_at: int) -> "SessionBuilder":
        self._session.enroll_start_at = enroll_start_at
        return self

    def enroll_end_at(self, enroll_end_at: int) -> "SessionBuilder":
        self._session.enroll_end_at = enroll_end_at
        return self

    def address(self, address: str) -> "SessionBuilder":
        self._session.address = address
        return self

    def enable_live(self, enable_live: bool) -> "SessionBuilder":
        self._session.enable_live = enable_live
        return self

    def meeting_type(self, meeting_type: int) -> "SessionBuilder":
        self._session.meeting_type = meeting_type
        return self

    def playback_type(self, playback_type: int) -> "SessionBuilder":
        self._session.playback_type = playback_type
        return self

    def playback_url(self, playback_url: str) -> "SessionBuilder":
        self._session.playback_url = playback_url
        return self

    def completion_condition(self, completion_condition: CompletionCondition) -> "SessionBuilder":
        self._session.completion_condition = completion_condition
        return self

    def enroll_limit(self, enroll_limit: int) -> "SessionBuilder":
        self._session.enroll_limit = enroll_limit
        return self

    def build(self) -> "Session":
        return self._session
