package com.cr.common

import java.text.SimpleDateFormat
import java.util.*
import kotlin.concurrent.scheduleAtFixedRate

/**
 * 操作系统：MAC系统
 * 创建者：王成
 * 创建日期：2023/9/14 10:18
 * 描述：时间管理器
 */
class CrTimerManager {
    private var timeCount: Long = 0  // define: 2023/9/14 计数器数量
    private var timer: Timer? = null  // define: 2023/9/14 计数器
    private var startDateTime:Long = 0  // define: 2023/9/14 开始计时时间
    private var nd:Long = 0  // define: 2023/9/14 一天的毫秒数
    private var nh:Long = 0  // define: 2023/9/14 一小时的毫秒数
    private var nm:Long = 0  // define: 2023/9/14 一分钟的毫秒数
    private var ns:Long = 0  // define: 2023/9/14 一秒钟的毫秒数

    /**
     * 接口
     */
    interface ITimerCountListener {
        // todo: 2023/9/14 计数器变更回调
        fun onTimer(count: Long, timeValue: String)
    }

    /**
     * 单例函数必备
     */
    object InstanceHelper {
        var self = CrTimerManager()
    }

    /**
     * 初始化
     */
    init {
        timer = Timer()
        nd = (1000 * 24 * 60 * 60).toLong()
        nh = (1000 * 60 * 60).toLong()
        nm = (1000 * 60).toLong()
        ns = 1000

    }

    companion object {
        /**
         * 获取单例
         * @return CrTimerManager
         */
        fun getInstance() = InstanceHelper.self
    }

    /**
     * 开始计数
     * @param delay 计数周期 单位是秒
     * @param callback ITimerCountListener 回调
     */
    fun startTimer(delay: Long, callback: ITimerCountListener) {
        // todo: 2023/9/14 先停止计数
        timer?.cancel()
        timer = Timer()
        // todo: 2023/9/14 计数器清零
        timeCount = 0
        startDateTime = System.currentTimeMillis()
        // todo: 2023/9/14 开始计数
        timer?.scheduleAtFixedRate(0, delay * 1000) {
            timeCount++
            // todo: 2023/9/14 计算毫秒时间差
            var diff = Date(System.currentTimeMillis()).time - Date(startDateTime).time
            val hour: Long = diff % nd / nh  // todo: 2023/9/14 计算差多少小时
            val min: Long = diff % nd % nh / nm // todo: 2023/9/14 计算差多少分钟
            val sec: Long = diff % nd % nh % nm / ns  // todo: 2023/9/14 计算差多少秒
            val hourStr = if(hour <10) "0${hour}" else "$hour"
            val miniStr = if(min <10) "0${min}" else "$min"
            val secStr = if(sec <10) "0${sec}" else "$sec"
            callback.onTimer(timeCount,"$hourStr:$miniStr:$secStr")
        }
    }

    /**
     * 停止计数
     */
    fun stopTimer() {
        timer?.cancel()
    }
}