MettViewController.swift 12.6 KB
//
//  MettViewController.swift
//  Twear
//
//  Created by yangbin on 2022/2/28.
//

import UIKit
import Charts
import SwiftDate

class MettViewController: UIViewController, DateSegmentViewDelegate, RangeSliderDelegate, ChartViewDelegate {
    
    @IBOutlet weak var dateSegmentView: DateSegmentView!
    @IBOutlet weak var barChartView: BarChartView!
    @IBOutlet weak var sliderView: RangeSliderView!
    @IBOutlet weak var dateLabel: UILabel!
    @IBOutlet weak var valueLabel: UILabel!
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var locLabel1: UILabel!
    @IBOutlet weak var locLabel2: UILabel!
    
    @IBOutlet weak var targetLabel: UILabel!
    @IBOutlet weak var totalLabel: UILabel!
    private var selectedDate = Date()
    private var points: [Double] = []
    private var dateType: DateType = .week
    private lazy var monthDays = DateInRegion().monthDays
    
    
    private var mettArray: [MettModel] = [] {
        didSet {
            if mettArray.count == 0 {
                resetLabel()
            }
            points = []
        }
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.navigationController?.setNavigationBarHidden(true, animated: true)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        dateSegmentView.dayLayout.constant = SCREEN_WIDTH/3.0 - 8
        dateSegmentView.dateType = .week
        dateSegmentView.selectedColor = UIColor.rgbColorFromHex(0x1CC9FD)
        dateSegmentView.weekButton.setTitleColor(UIColor.rgbColorFromHex(0x1CC9FD), for: .normal)
        dateSegmentView.delegate = self
        sliderView.delegate = self
        titleLabel.text = LocString("梅脱")
        
        locLabel1.text = LocString("本周累计")
        locLabel2.text = LocString("目标")
        
        view.layoutIfNeeded()
        setupChartView()
        didSelectedDate(date: DateInRegion(), dateType: .week)
        // Do any additional setup after loading the view.
    }
    
    
    private func updateLable(_ index: Int) {
       
        if mettArray.count == 0 {
            resetLabel()
            return
        }

        valueLabel.text = "\(mettArray[index].value)"
//        var value = mettArray[index].value
//        averageLabel.text = pressureArray[index].value == -1 ? "--" : "\(pressureArray[index].value)"
//        rangeLabel.text = "\(minArray[index])-\(maxArray[index])"
        totalLabel.text = "\(mettArray.sum(\.value))"
        if dateType == .week {
            targetLabel.text = "600"
            locLabel2.text = LocString("目标")
        } else if dateType == .month {
            targetLabel.text = "\(mettArray.sum(\.value)/selectedDate.weekOfMonth)"
            locLabel2.text = LocString("每周平均")
        } else if dateType == .year {
            targetLabel.text = "\(mettArray.sum(\.value)/selectedDate.weekOfYear)"
            locLabel2.text = LocString("每周平均")
        }
//        switch value {
//        case 1..<30:
//            detailLabel.text = LocString("轻松")
//        case 30..<60:
//            detailLabel.text = LocString("正常")
//        case 60..<80:
//            detailLabel.text = LocString("中等")
//        case 80..<100:
//            detailLabel.text = LocString("偏高")
//        default:
//            detailLabel.text = LocString("正常")
//        }
//
//        pressureLabel.text = "\(pressureArray[index].value)"
//
        let sDate = mettArray[index].date!
        switch dateType {
        case .day:
            dateLabel.text = sDate.toString(.custom("HH:mm"))
        case .week:
            locLabel1.text = LocString("本周累计")
            dateLabel.text = sDate.toString(.custom("yyyy.MM.dd")) + " " + sDate.weekText// + " " + LocString("平均血氧")
        case .month:
            locLabel1.text = LocString("本月累计")
            dateLabel.text = sDate.toString(.custom("yyyy.MM.dd"))// + " " + LocString("平均血氧")
        case .year:
            locLabel1.text = LocString("本年累计")
            dateLabel.text = sDate.toString(.custom("yyyy.MM"))// + " " + LocString("平均血氧")
        }
    }
    
    //MARK: DateSegmentViewDelegate
    func didSelectedDate(date: DateInRegion, dateType: DateType) {
        self.dateType = dateType
        monthDays = date.monthDays
        selectedDate = date.date
//        print(selectedDate)
//        print("年周 \(selectedDate.weekOfYear)")
//        print("月周 \(selectedDate.weekOfMonth)")
//        print("-----")
        switch dateType {
        case .week:
            mettArray = MettModel.getMettByWeek(selectedDate)
            dateLabel.text = (date.dateAt(.startOfWeek)+1.days).toString(.custom("yyyy.MM.dd")) + " " + LocString("周一")// + " " + LocString("平均血氧")
        case .month:
            mettArray = MettModel.getMettByMonth(selectedDate)
            dateLabel.text = date.dateAt(.startOfMonth).toString(.custom("yyyy.MM.dd"))// + " " + LocString("平均血氧")
        case .year:
            mettArray = MettModel.getMettByYear(selectedDate)
            dateLabel.text = date.dateAtStartOf(.year).toString(.custom("yyyy.MM"))// + " " + LocString("平均血氧")
        default:
            break
        }
        
        updateChartView()
        
    }
    
    @IBAction func share(_ sender: Any) {
        let shareView = ShareView(view.captureImage)
        shareView.show()
    }
    //MARK: RangeSliderDelegate
    func sliderDidChanged(index: Int) {
        barChartView.highlightValues([Highlight(x: points[index], y: 0, dataSetIndex: 0)])
        updateLable(index)
    }
    
    //MARK: ChartViewDelegate
    func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) {
        if mettArray.count == 1 {
            barChartView.highlightValues([Highlight(x: points[0], y: 0, dataSetIndex: 0)])
        } else {
            sliderView.didSelectedValue(entry.x)
        }
    }
    
    private func resetLabel() {
        dateLabel.text = "--"
        valueLabel.text = "--"
        totalLabel.text = "--"
        targetLabel.text = "--"
        
        switch dateType {
        case .week:
            locLabel2.text = LocString("目标")
            locLabel1.text = LocString("本周累计")
        case .month:
            locLabel1.text = LocString("本月累计")
            locLabel2.text = LocString("每周平均")
        case .year:
            locLabel1.text = LocString("本年累计")
            locLabel2.text = LocString("每周平均")
        default:
            break
        }
    }
    
    
    
    private func updateChartView() {
        
        let xAxis = barChartView.xAxis
        var barWidth: Double = 0.6
        switch dateType {
        case .day:
            xAxis.valueFormatter = IndexAxisValueFormatter(values: DayXValues)
            xAxis.labelCount = 9
            xAxis.axisMinimum = -2.9
            xAxis.axisMaximum = 24 + 2
        case .week:
            barWidth = 0.25
            xAxis.valueFormatter = IndexAxisValueFormatter(values: WeekXValues)
            xAxis.labelCount = 7
            xAxis.axisMinimum = -0.8
            xAxis.axisMaximum = 6 + 0.8
        case .month:
            xAxis.valueFormatter = IndexAxisValueFormatter(values: MonthXValues(monthDays))
            xAxis.labelCount = 8
            xAxis.axisMinimum = -3.5
            xAxis.axisMinLabels = 8
            xAxis.axisMaximum = Double(monthDays-1) + 2.1
        case .year:
            barWidth = 0.4
            xAxis.valueFormatter = IndexAxisValueFormatter(values: MonthValues)
            xAxis.labelCount = 12
            xAxis.axisMinimum = -1.3
            xAxis.axisMaximum = 11 + 0.8
        }
        
        
        var dataEntries = [BarChartDataEntry]()
        
        
        for mett in mettArray {
//            if mett.value > 0 {
                var pointX: Double = 0
                switch dateType {
                case .day:
                    break
                case .week:
                    pointX = Double(mett.date!.weekIndex)
                case .month:
                    pointX = Double(mett.date!.day-1)
                case .year:
                    pointX = Double(mett.date!.month-1)
                }
                points.append(pointX)
                dataEntries.append(BarChartDataEntry(x: pointX, y: Double(mett.value)))
//            }
        }
        
        //            for sleep in sleepSummaryArray {
        //                if sleep.sleepLength > 0 {
        //                    var pointX: Double = 0
        //                    switch dateType {
        //                    case .day:
        //                        break
        //                    case .week:
        //                        barWidth = 0.25
        //                        pointX = Double(sleep.endDate!.weekIndex)
        //                    case .month:
        //                        pointX = Double(sleep.endDate!.day-1)
        //                    case .year:
        //                        barWidth = 0.4
        //                        pointX = Double(sleep.endDate!.month-1)
        //                    }
        //                    points.append(SleepPoint(point: pointX, type: .awake, length: 0))
        //                    dataEntries.append(BarChartDataEntry(x: pointX, y: Double(sleep.light+sleep.deep)/60))
        //                }
        //            }
        let dataSet = BarChartDataSet(entries: dataEntries)
        dataSet.colors = [UIColor.rgbColorFromHex(0x00C5FF)]
        dataSet.highlightEnabled = true
        dataSet.highlightColor = UIColor.rgbColorFromHex(0x00C5FF)
        dataSet.drawValuesEnabled = false
        let chartData = BarChartData(dataSets: [dataSet])
        chartData.barWidth = barWidth
        barChartView.data = chartData
        
        
        barChartView.highlightValues([Highlight(x: 0, y: 0, dataSetIndex: 0)])
    
            setupSliderViewScale()
    
        
    }
    private func setupSliderViewScale() {
        var endPointX: Int = 0
        switch dateType {
        case .day:
            endPointX = 24
        case .week:
            endPointX = 6
        case .month:
            endPointX = monthDays-1
        case .year:
            endPointX = 11
        }
        sliderView.setDrawSpace(startPointX: getChartViewX(0), endPointX: getChartViewX(endPointX), range: 0...endPointX, points: points, imageName: "slider_mett", isLast: true)
    }
    
    
    
    private func getChartViewX(_ x: Int) -> CGFloat {
        return barChartView.pixelForValues(x: Double(x), y: 0, axis: .left).x
    }
    
    
    private func setupChartView() {
        barChartView.delegate = self
        barChartView.chartDescription?.enabled = false //图描述
        barChartView.legend.enabled = false //左下角图例
        barChartView.setScaleEnabled(false) //可滑动
        barChartView.rightAxis.enabled = false //不绘制右边轴的信息
        
        let leftAxis = barChartView.leftAxis
        leftAxis.labelTextColor = ChartsTextColor
        leftAxis.labelFont = ChartsTextFont(11)
        
        leftAxis.yOffset = -5
        leftAxis.xOffset = -3
        leftAxis.gridLineDashLengths = [2.0, 2.0]  //设置虚线样式的网格线
        leftAxis.gridColor = LineColor
        leftAxis.gridLineWidth = 1
        leftAxis.axisLineWidth = 0
        leftAxis.drawGridLinesBehindDataEnabled = false
        leftAxis.labelPosition = .insideChart
        
        
        leftAxis.axisMinimum = 0 //设置左侧Y轴最小值
        leftAxis.axisMaximum = 100
        leftAxis.granularity = 20
        
        let litmitLine = ChartLimitLine(limit: 0, label: "")
        litmitLine.lineWidth = 1
        litmitLine.lineColor = LineColor
        leftAxis.addLimitLine(litmitLine)
        leftAxis.drawLimitLinesBehindDataEnabled = false  //设置限制线绘制在折线图的后面
        
        
        let xAxis = barChartView.xAxis
        xAxis.granularity = 1 //间隔
        xAxis.labelPosition = .bottom
        xAxis.labelFont = ChartsTextFont(11)
        xAxis.labelTextColor = ChartsTextColor
        xAxis.drawGridLinesBehindDataEnabled = false
        xAxis.axisLineColor = LineColor
        xAxis.axisLineWidth = 1
        xAxis.gridLineDashLengths = [6, 666]
        xAxis.gridColor = LineColor
        xAxis.drawAxisLineEnabled = false
        
    }
    
    
    @IBAction func back(_ sender: Any) {
        navigationController?.popViewController(animated: true)
    }
    
    @IBAction func gotoReferenceVC(_ sender: Any) {
        let vc = UIStoryboard.loadViewControllerIdentifier(storyboardName: "Home", identifier: "MettReferenceVC")
        navigationController?.pushViewController(vc, animated: true)
    }
    
    
}