package studentsystem
import std.collection.*
import std.env.*

/**
 * 课程 管理类(单例模式)
 */
public class CourseManager {

    // 单例模式:无法从外部访问构造函数
    private CourseManager(
        var courses!: ArrayList<Course> = ArrayList<Course>() // 课程列表
    ) {}

    // 单例对象
    private static let instance: CourseManager = CourseManager()

    // 通过属性获取单例对象
    static prop propInstance: CourseManager {
        get() {
            instance
        }
    }

    // ─────────────────────────────────────────────────────────────────────────
    // 查:显示所有课程信息
    // ─────────────────────────────────────────────────────────────────────────

    /**
     * 显示课程信息
     */
    func printCourses() {
        for (course in courses) {
            println(course.toString())
        }
        println("课程总数: ${courses.size}!")
    }

    // ─────────────────────────────────────────────────────────────────────────
    // 增:录入课程信息
    // ─────────────────────────────────────────────────────────────────────────

    /**
     * 录入课程信息
     */
    func inputCourse() {
        println("开始录入课程信息:")
        try {
            // 获取用户输入的基本信息
            print("请输入课程编号:")
            let id = inputInfo<UInt32>()
            print("请输入课程名称:")
            let name = getStdIn().readln() ?? ""
            print("请输入课程性质(必修【1】,选修【2】):")
            let electivity = if (inputInfo<Int64>(1, 2) == 1) {
                Compulsory
            } else {
                Elective
            }
            print("请输入课程学分:")
            let credit = inputInfo<Float16>(0.0, 10.0)
            // 创建课程类对象
            let course = Course(id, name, credit, electivity: electivity)
            // 将 course 添加到 courses 中
            courses.add(course)
            println("录入完毕!")
        } catch (e: Exception) {
            println(e.message)
        }
    }

    // ─────────────────────────────────────────────────────────────────────────
    // 查:查询课程信息
    // ─────────────────────────────────────────────────────────────────────────

    /**
     * 查询课程信息
     */
    func queryCourse() {
        print("请输入课程号:")
        let courseId = inputInfo<UInt32>()
        // 查找课程
        for (course in courses) {
            // 查找到课程
            if (courseId == course.propId) {
                println("查询成功,信息如下:")
                println(course.toString())
                return
            }
        }
        println("未找到课程!")
    }

    // ─────────────────────────────────────────────────────────────────────────
    // 删:删除课程信息
    // ─────────────────────────────────────────────────────────────────────────

    /**
     * 删除课程信息
     */
    func deleteCourse() {
        print("请输入课程号:")
        let courseId = inputInfo<UInt32>()
        // 查找课程
        for (i in 0..courses.size) {
            // 查找到课程
            if (courseId == courses[i].propId) {
                courses.remove(at: i)
                println("编号${courseId}课程删除成功!")
                return
            }
        }
        println("未找到课程!")
    }

    // ─────────────────────────────────────────────────────────────────────────
    // 改:修改课程信息
    // ─────────────────────────────────────────────────────────────────────────

    /**
     * 修改课程信息
     */
    func modifyCourse() {
        print("请输入课程号:")
        let courseId = inputInfo<UInt32>()
        // 查找课程
        for (course in courses) {
            // 查找到课程
            if (courseId == course.propId) {
                println("查询成功,信息如下:")
                println(course.toString())

                // 修改信息
                print("是否修改课程名称?(是【1】 否【2】):")
                if (inputInfo<Int64>(1, 2) == 1) {
                    print("请输入课程名称:")
                    course.propName = getStdIn().readln() ?? ""
                }
                print("是否修改课程性质?(是【1】 否【2】):")
                if (inputInfo<Int64>(1, 2) == 1) {
                    print("请输入课程性质(必修【1】,选修【2】):")
                    course.propElectivity = if (inputInfo<Int64>(1, 2) == 1) {
                        Compulsory
                    } else {
                        Elective
                    }
                }
                print("是否修改课程学分?(是【1】 否【2】):")
                if (inputInfo<Int64>(1, 2) == 1) {
                    print("请输入课程学分:")
                    course.propCredit = inputInfo<Float16>(0.0, 10.0)
                }
                println("修改成功!")
                return
            }
        }
        println("未找到课程!")
    }

    // ─────────────────────────────────────────────────────────────────────────
    // 工具:通过课程 ID 查找课程对象(供 ScoreManager 调用)
    // ─────────────────────────────────────────────────────────────────────────

    /**
     * 根据课程 ID 查找课程,找不到返回 None
     */
    func findById(courseId: UInt32): Option<Course> {
        for (course in courses) {
            if (course.propId == courseId) {
                return Some(course)
            }
        }
        return None
    }
}