package studentsystem
import std.convert.*
import std.env.*

/**
 * 将输入信息转换为指定类型的值;如输入信息有误,则重新输入
 *
 * @return 指定 T 类型的值
 */
func inputInfo<T>(): T where T <: Parsable<T> {
    var retryNum = 3
    while (retryNum != 0) {
        var input = getStdIn().readln() ?? ""
        var value = T.tryParse(input)
        if (value.isSome()) {
            return value.getOrThrow()
        } else {
            print("输入错误,请重新输入(还有${retryNum}次机会):")
        }
        retryNum--
    }
    throw Exception("输入错误超过 3 次,取消录入!")
}

/**
 * 将输入信息转换为指定类型的值;如输入信息有误,则重新输入(带范围校验)
 *
 * @param min 数值最小值
 * @param max 数值最大值
 * @return 指定 T 类型的值
 */
func inputInfo<T>(min: T, max: T): T where T <: Parsable<T> & Comparable<T> {
    var retryNum = 3
    while (retryNum != 0) {
        var input = getStdIn().readln() ?? ""
        var value = T.tryParse(input)
        if (value.isSome()) {
            // 检查是否在范围之内
            if (value.getOrThrow() < min || value.getOrThrow() > max) {
                print("数值范围超限,请重新输入:")
                retryNum--
                continue
            }
            return value.getOrThrow()
        } else {
            print("输入错误,请重新输入(还有${retryNum}次机会):")
            retryNum--
        }
    }
    throw Exception("输入错误超过 3 次,取消录入!")
}

/**
 * 清除控制台屏幕并复位光标
 */
func clear() {
    // 使用 print 而非 println,避免清屏后多出一个换行
    print("\u{001b}[2J\u{001b}[H")
}

/**
 * 暂停函数
 */
func pause() {
    println("点击回车键继续...")
    getStdIn().readln()
    // clear()
}