package com.github.mikephil.charting.manager

import com.github.mikephil.charting.animation.Easing
import com.github.mikephil.charting.charts.BarChart
import com.github.mikephil.charting.components.XAxis
import com.github.mikephil.charting.data.BarData
import com.github.mikephil.charting.data.BarDataSet
import com.github.mikephil.charting.data.BarEntry
import com.github.mikephil.charting.formatter.IAxisValueFormatter
import com.github.mikephil.charting.interfaces.datasets.IBarDataSet


class MBarChartManager(var mBarChart: BarChart) {

    fun init() {
        mBarChart.apply {
            //设置阴影 设置柱状图的背景阴影，开启后性能会下降 50%，所以没特殊要求都不要开。
            setDrawBarShadow(false)
            //设置具体数值展示在柱状图长方形里面还是外面，true 就是外面
            setDrawValueAboveBar(true)
            //不显示描述
            description.isEnabled = false

            setPinchZoom(false)
            //是否显示表格颜色
            setDrawGridBackground(false)
            //设置是否可以缩放
            setScaleEnabled(false)
            //设置是否可以触摸
            setTouchEnabled(true)
            //设置是否可以拖拽
            isDragEnabled = false

            //Y轴左侧隐藏
            axisRight.isEnabled = false
            //Y轴右侧隐藏
            axisLeft.isEnabled = false
            //示例隐藏
            legend.isEnabled = false
            //将条形图宽度的一半添加到x轴范围的每一侧，以便使条形图的条形图完全显示。
            setFitBars(true)
        }
    }

    /**
     * 设置X轴
     *
     * @param position 下标位置
     * @param maxVisibleValueCount 最大显示数量
     * @param labelCount 刻度数
     * @param format X轴适配器
     * @param showDrawAxisLine 是否显示X轴线
     * @param showDrawGridLines 是否显示网格线
     * @param granularity 下标间隔
     * @param centerAxisLabels label文字是否居中
     *
     */
    fun setXAxis(position: XAxis.XAxisPosition, maxVisibleValueCount: Int, labelCount: Int, format: IAxisValueFormatter, showDrawAxisLine: Boolean = false,
                 showDrawGridLines: Boolean = false, granularity: Float = 1f, centerAxisLabels: Boolean = false){
        mBarChart.apply {
            //自定义坐标轴适配器，设置在X轴
            //下标位置
            xAxis.position = position

            //设置最大显示数量
            setMaxVisibleValueCount(maxVisibleValueCount)
            //设置旋转角度
///        xAxis.setLabelRotationAngle(-45f)
            // 设置 x 坐标轴 宽度
///        xAxis.setAxisLineWidth(2f)
            // 设置 x轴 的刻度数量
            xAxis.labelCount = labelCount
            //是否显示轴线
            xAxis.setDrawAxisLine(showDrawAxisLine)
            //是否显示网格线
            xAxis.setDrawGridLines(showDrawGridLines)
            //下标间隔
            xAxis.granularity = granularity
            //文字大小
//            xAxis.textSize = dp2px(8).toFloat()
            //文字居中
            xAxis.setCenterAxisLabels(centerAxisLabels)
            //最小值（小于文字宽度一半最佳）
//            xAxis.axisMinimum = -0.3f
            //最大值（大于文字宽度一半最佳）
///        xAxis.setAxisMaximum(3.3f)
            //设置X轴文字自定义适配器
            xAxis.valueFormatter = format
            //            xAxis.setValueFormatter { value, axis ->
//                value.toString()
//            }
        }
    }

    /**
     * 创建数据
     * @param barEntryList 数据
     * @param colors 颜色
     * @param title 标题
     * @param valueTextSize 设置数据文本大小
     * @param barWidth 设置bar宽度
     * @param fromX X轴起点
     * @param groupSpace 组与组之间的间隔
     * @param barSpace 组内柱子间的间距
     * */
    fun setData(
        barEntryList: List<BarEntry>,
        colors: List<Int>,
        title: String,
        valueTextSize: Float = 0f,
        barWidth: Float = 0f
    ) {
        //图例颜色示意
        var set1 = BarDataSet(barEntryList, title)
        set1.colors = colors
        set1.setDrawIcons(false)

        var data = BarData(set1)
        data.setValueTextSize(valueTextSize)
        data.barWidth = barWidth
//        //重点！   三个参数   分别代表   X轴起点     组与组之间的间隔      组内柱子的间隔
//        data.groupBars(fromX, groupSpace, barSpace)
        mBarChart.data = data
    }

    fun setData(
        barDataSet: List<IBarDataSet>,
        valueTextSize: Float,
        barWidth: Float,
        fromX: Float = 0f,
        groupSpace: Float = 0f,
        barSpace: Float = 0f
    ) {
        var data = BarData(barDataSet)
        data.setValueTextSize(valueTextSize)
        data.barWidth = barWidth
        //重点！   三个参数   分别代表   X轴起点     组与组之间的间隔      组内柱子的间隔
        data.groupBars(fromX, groupSpace, barSpace);
        mBarChart.data = data
    }

    /**
     * 动画
     * @see 动画失效可能原因 1.添加混淆文件 2.先调用invalidate方法刷新数据
     * @param durationMillis 动画时长
     * @param easing 缓动函数
     */
    fun animateY(durationMillis: Int, easing: Easing.EasingFunction? = null) {
        if (null == easing) {
            mBarChart.animateY(durationMillis)
        } else {
            mBarChart.animateY(durationMillis, easing)
        }
    }

    /**
     * 动画
     *
     * @see 动画失效可能原因 1.添加混淆文件 2.先调用invalidate方法刷新数据
     * @param durationMillis 动画时长
     * @param easing 缓动函数
     */
    fun animateX(durationMillis: Int, easing: Easing.EasingFunction? = null) {
        if (null == easing) {
            mBarChart.animateX(durationMillis)
        } else {
            mBarChart.animateX(durationMillis, easing)
        }
    }

    /**
     * 动画
     * @see 动画失效可能原因 1.添加混淆文件 2.先调用invalidate方法刷新数据
     * @param durationMillis 动画时长
     * @param easing 缓动函数
     */
    fun animateXY(
        durationMillisX: Int,
        durationMillisY: Int,
        easing: Easing.EasingFunction? = null
    ) {
        if (null == easing) {
            mBarChart.animateXY(durationMillisX, durationMillisY)
        } else {
            mBarChart.animateXY(durationMillisX, durationMillisY, easing)
        }
    }

    /**
     * 刷新
     * */
    fun invalidate() {
        mBarChart.invalidate()
    }

}
