package studentsystem

import std.convert.*

/**
 * 课程性质 枚举类型
 */
public enum Electivity <: ToString {
    | Compulsory    // 必修课
    | Elective      // 选修课

    // ToString 接口定义的转换字符串的函数
    public func toString() {
        match (this) {
            case Compulsory => "必修课"
            case Elective   => "选修课"
        }
    }
}

/**
 * 课程 类
 */
public class Course <: ToString {

    /**
     * 主构造函数
     *
     * @param id         课程编号
     * @param name       课程名称
     * @param credit     课程学分
     * @param electivity 课程性质(默认为必修课)
     */
    public Course(
        private let id: UInt32,
        private var name: String,
        private var credit: Float16,
        private var electivity!: Electivity = Electivity.Compulsory
    ) {}

    // 成员属性 propId(只读)
    prop propId: UInt32 {
        get() {
            id
        }
    }

    // 成员属性 propName(可读写)
    mut prop propName: String {
        get() {
            name
        }
        set(name) {
            this.name = name
        }
    }

    // 成员属性 propCredit(可读写)
    mut prop propCredit: Float16 {
        get() {
            credit
        }
        set(credit) {
            this.credit = credit
        }
    }

    // 成员属性 propElectivity(可读写)
    mut prop propElectivity: Electivity {
        get() {
            electivity
        }
        set(electivity) {
            this.electivity = electivity
        }
    }

    /**
     * 输出课程信息(ToString 接口定义的转换字符串的函数)
     */
    public func toString() {
        "课程: ${id} ${name} 性质: ${electivity} 学分: ${credit.format(".1")}"
    }
}