package com.zj365.health.weight

import android.content.Context
import android.widget.TextView
import androidx.core.content.ContextCompat
import com.github.mikephil.charting.components.MarkerView
import com.github.mikephil.charting.data.Entry
import com.github.mikephil.charting.highlight.Highlight
import com.github.mikephil.charting.utils.MPPointF
import com.xty.base.utils.OrganStatusCalcUtil
import com.zj365.health.R
import java.text.DecimalFormat


/**
 * 对应第几页
 * @param page 0:心率 1：血压 2：血氧 3：体温 4：睡眠 5：呼吸率 6：血糖
 */
class IMarkView(context: Context?, layoutResource: Int, var unit: String, var page: MarkPage) :
    MarkerView(context, layoutResource) {


    enum class MarkPage(val title: String) {
        /**血压**/
        XYa("血压"),
        /**血氧**/
        XYang("血氧"),
        /**心率**/
        XLv("心率"),
        /**体温**/
        Temp("体温"),
        /**睡眠**/
        Sleep("睡眠"),
        /**呼吸率**/
        Breath("呼吸率"),
        /**血糖**/
        XTang("血糖"),
        /**睡眠----天**/
        Sleep_Day("睡眠-天"),
        /**尿酸**/
        UricAcid("尿酸"),

        Tc("总胆固醇"),

        Tg("甘油三酯"),

        Hdl("高密度脂蛋白"),

        Ldl("低密度脂蛋白")
    }

    var dbpValue = arrayListOf<Entry>()  //低压数据曲线数据
    var gbpValue = arrayListOf<Entry>()  //高压数据曲线数据
    var tvValue: TextView
    var tvTime: TextView
    var tvStatus: TextView
    var df: DecimalFormat = DecimalFormat("0.00")

    init {
        tvValue = findViewById(R.id.mTvValue)
        tvTime = findViewById(R.id.mTvTime)
        tvStatus = findViewById(R.id.mTvStatus)

    }

    /**
     * 保留小数位
     */
    private fun changeDecimals(str:String, number: Int):String {
        return  String.format("%.${number}f",str.toFloat())
    }

    override fun refreshContent(e: Entry?, highlight: Highlight?) {

        when (page) {
            MarkPage.XYa -> {
                var datas = e!!.data as MutableList<String>
                tvTime.text = "${datas[0]}"
                tvValue.text = "${changeDecimals(datas[2], 0)} /${changeDecimals(datas[3], 0)} $unit"
            }
            MarkPage.Temp,
            MarkPage.XTang-> {
                tvValue.text = "${changeDecimals(e!!.y.toString(), 1)} $unit"
                tvTime.text = "${e!!.data as String}"
            }
            MarkPage.UricAcid ->{
                tvValue.text = "${e!!.y.toInt()} $unit"
                tvTime.text = "${e!!.data as String}"
            }
            MarkPage.Tc, MarkPage.Tg, MarkPage.Hdl, MarkPage.Ldl ->{
                tvValue.text = "${changeDecimals(e!!.y.toString(), 2)} $unit"
                tvTime.text = "${e!!.data as String}"
            }
            else -> {
                tvValue.text = "${e!!.y.toInt()} $unit"
                tvTime.text = "${e!!.data}"
            }
        }

        tvStatus.text =getStatus(e)
        if( getStatus(e)=="正常"){
            tvStatus.setTextColor(ContextCompat.getColor(context,R.color.col_41c))
        }else{
            tvStatus.setTextColor(ContextCompat.getColor(context,R.color.col_e8a))
        }



        super.refreshContent(e, highlight)
    }

    override fun getOffset(): MPPointF {
        return MPPointF((-(width / 2)).toFloat(), (-height).toFloat())

    }

    private val STOKE_WIDTH = 5f //这里对于stroke_width的宽度也要做一定偏移


    override fun getOffsetForDrawingAtPoint(posX: Float, posY: Float): MPPointF? {
        val offset = offset
        val chart = chartView
        val width = width.toFloat()
        val height = height.toFloat()
        // posY \posX 指的是markerView左上角点在图表上面的位置
        //处理Y方向
        if (posY <= height) { // 如果点y坐标小于markerView的高度，如果不处理会超出上边界，处理了之后这时候箭头是向上的，我们需要把图标下移一个箭头的大小
            offset.y = 0f
        } else { //否则属于正常情况，因为我们默认是箭头朝下，然后正常偏移就是，需要向上偏移markerView高度和arrow size，再加一个stroke的宽度，因为你需要看到对话框的上面的边框
            offset.y = -height - STOKE_WIDTH // 40 arrow height   5 stroke width
        }
        //处理X方向，分为3种情况，1、在图表左边 2、在图表中间 3、在图表右边（不考虑超出屏幕问题）
        offset.x = 0f
        if (posX > chart.width - width) {//如果超过右边界，则向左偏移markerView的宽度
            offset.x = -width;
        } else {//默认情况，不偏移（因为是点是在左上角）
            offset.x = 0f
            if (posX > width / 2) {//如果大于markerView的一半，说明箭头在中间，所以向右偏移一半宽度
                offset.x = -(width / 2);
            }
        }

        return offset
    }


    private fun getStatus(e: Entry?): String {
        when (page) {
            MarkPage.XLv -> {//心率状态值
                return OrganStatusCalcUtil.heartStrStatu(e!!.y)
            }
            MarkPage.XYa -> {//血压状态值
                var datas = e!!.data as MutableList<String>
                var g = datas[2].toFloat()
                return OrganStatusCalcUtil.bloodStrStatu(g)
            }
            MarkPage.XYang -> {//血氧状态值
                return OrganStatusCalcUtil.ooStrStatu(e!!.y)
            }
            MarkPage.Temp -> {//体温状态值
                return OrganStatusCalcUtil.tempStrStatu(e!!.y)
            }
            MarkPage.Sleep -> {//睡眠状态值
                return OrganStatusCalcUtil.sleepStrStatu(e!!.y)
            }
            MarkPage.Breath -> {//呼吸状态值
                return OrganStatusCalcUtil.respiratoryStrStatu(e!!.y)
            }
            MarkPage.XTang -> {//血糖状态值
                return OrganStatusCalcUtil.bloodSugarStatuText(e!!.y)
            }

            MarkPage.UricAcid ->{
                return OrganStatusCalcUtil.UricAcidStatuText(e!!.y)
            }

            MarkPage.Tc ->{
                return OrganStatusCalcUtil.tcStatuText(e!!.y)
            }

            MarkPage.Tg ->{
                return OrganStatusCalcUtil.tgStatuText(e!!.y)
            }

            MarkPage.Hdl ->{
                return OrganStatusCalcUtil.hdlStatuText(e!!.y)
            }

            MarkPage.Ldl ->{
                return OrganStatusCalcUtil.ldlStatuText(e!!.y)
            }

            else -> {}
        }

        return ""
    }

}