RecordDetailVC.swift 12.5 KB
//
//  RecordDetailVC.swift
//  Twear
//
//  Created by yangbin on 2021/12/30.
//

import UIKit
import SwiftDate



class RecordDetailVC: UIViewController {

    @IBOutlet weak var titleTopLayout: NSLayoutConstraint!
    @IBOutlet weak var tableViewHeight: NSLayoutConstraint!
    @IBOutlet weak var tableView: UITableView!
   
    @IBOutlet weak var totalTitleLabel: UILabel!
    @IBOutlet weak var timeTitleLabel: UILabel!
    @IBOutlet weak var distanceTitleLabel: UILabel!
    @IBOutlet weak var calorieTitleLabel: UILabel!
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var totalDistanceLabel: UILabel!
    @IBOutlet weak var totalCalorieLabel: UILabel!
    @IBOutlet weak var totalTimeLabel: UILabel!
    @IBOutlet weak var totalNumberLabel: UILabel!

    @IBOutlet weak var maxDistanceLabel: UILabel!
    @IBOutlet weak var maxCalorieLabel: UILabel!
    @IBOutlet weak var maxTimeLabel: UILabel!
    
    @IBOutlet weak var scrollTopLayout: NSLayoutConstraint!
    
    var motionType: TrainType = .running
    
    private var page: Int = 1
    private let nowDate = DateInRegion()
    private var motionList: [MotionRecord] = []
    
    var device = CurDevice
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationController?.setNavigationBarHidden(true, animated: true)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        titleTopLayout.constant = StatusBarHeight + 10
        scrollTopLayout.constant = StatusBarHeight
        calorieTitleLabel.text = LocString("单次最高热量(千卡)")
        if device.distanceUnit == 0 {
            totalTitleLabel.text = LocString("累计距离(公里)")
        } else {
            totalTitleLabel.text = LocString("累计距离(英里)")
        }
       
        switch motionType {
        case .running, .run_indoor:
            titleLabel.text = LocString("跑步记录")
            timeTitleLabel.text = LocString("单次最长用时")
            if device.distanceUnit == 0 {
                distanceTitleLabel.text = LocString("单次最远距离(公里)")
            } else {
                distanceTitleLabel.text = LocString("单次最远距离(英里)")
            }
           
        case .walking:
            titleLabel.text = LocString("步行记录")
            timeTitleLabel.text = LocString("单次最长用时")
            if device.distanceUnit == 0 {
                distanceTitleLabel.text = LocString("单次最远距离(公里)")
            } else {
                distanceTitleLabel.text = LocString("单次最远距离(英里)")
            }
            
        case .bicycle:
            titleLabel.text = LocString("骑行记录")
            timeTitleLabel.text = LocString("单次最长用时")
            if device.distanceUnit == 0 {
                distanceTitleLabel.text = LocString("单次最远距离(公里)")
            } else {
                distanceTitleLabel.text = LocString("单次最远距离(英里)")
            }
           
        case .mountaineering:
            titleLabel.text = LocString("爬山记录")
            if device.distanceUnit == 0 {
                timeTitleLabel.text = LocString("单次最远距离(公里)")
                distanceTitleLabel.text = LocString("单次最高爬升(米)")
            } else {
                timeTitleLabel.text = LocString("单次最远距离(英里)")
                distanceTitleLabel.text = LocString("单次最高爬升(英尺)")
            }
           
        default:
            break
        }
        
        
        tableView.register(UINib.init(nibName: "MotionRecordCell", bundle: Bundle.main), forCellReuseIdentifier: "MotionRecordCell")
        tableView.contentInset = UIEdgeInsets.init(top: 0, left: 0, bottom: 0, right: 0)
        tableView.tableFooterView = UIView(frame: CGRect.zero)
        getMotionRecordList()
        // Do any additional setup after loading the view.
    }
    
    @IBAction func back(_ sender: Any) {
        navigationController?.popViewController(animated: true)
    }
    private func getMotionRecordList(page: Int = 1) {
        if page == 1 {
            motionList = []
        }
        var totalMotions: [MotionModel] = []
        for i in 12*(page-1)..<12*(page-1)+12 {
            let motionArray = MotionModel.getMonthData(motionType.rawValue, date: (nowDate-i.months).date)
//            if 12-i == 10 || 12-i == 9 || 12-i == 8 || 12-i == 7 {
//                let t1 = MotionModel(type: .running, date: DateInRegion().date-100, length: 100, calorie: 200, distance: 300, steps: 500, altitude: 2)
//                let t2 = MotionModel(type: .steppers, date: DateInRegion().date-300.minutes, length: 66, calorie: 1000, distance: 300, steps: 500, altitude: 2)
//                let t3 = MotionModel(type: .steppers, date: DateInRegion().date+7.hours, length: 1000, calorie: 1000, distance: 300, steps: 500, altitude: 2)
//                motionArray = [t2, t1, t3]
//            }
            if motionArray.count > 0 {
                totalMotions.append(contentsOf: motionArray)
                let motion = MotionRecord(isShow: false, motionArray: motionArray.reversed(), date: (nowDate-i.months).toString(.custom("yyyy-MM")))
                motionList.append(motion)
            }
            
        }
        if motionList.count == 0 {
//            let motionArray = MotionModel.getMotionByMonth(nowDate.date)
            let motion = MotionRecord(isShow: false, motionArray: [], date: nowDate.toString(.custom("yyyy-MM")))
            motionList.append(motion)
        } else {
//            motionList[0].isShow = true
//            tableView.reloadData()
        }
        if motionList.count == 1 {
            tableViewHeight.constant = 50
        } else {
            tableViewHeight.constant = CGFloat(60*motionList.count)
        }
        
        
        self.tableView.reloadData()
   
        
        if totalMotions.count == 0 {
            return
        }
        if device.distanceUnit == 0 {
            if motionType == .mountaineering {
                if let maxAltitude = totalMotions.max(\.altitude)?.altitude {
                    maxDistanceLabel.text = "\(String(format:"%.2f", Float(maxAltitude)))"
                }
                if let maxDistance = totalMotions.max(\.distance)?.distance {
                    maxTimeLabel.text = "\(String(format:"%.2f", Float(maxDistance)/1000))"
                }
            } else {
                if let maxDistance = totalMotions.max(\.distance)?.distance {
                    maxDistanceLabel.text = "\(String(format:"%.2f", Float(maxDistance)/1000))"
                }
                if let maxTime = totalMotions.max(\.length)?.length {
                    maxTimeLabel.toTimeType3(length: maxTime)
                }
            }
            totalDistanceLabel.text = "\(String(format:"%.2f", Float(totalMotions.sum(\.distance))/1000))"
        } else {
            if motionType == .mountaineering {
                if let maxAltitude = totalMotions.max(\.altitude)?.altitude {
                    maxDistanceLabel.text = "\(String(format:"%.2f", Float(maxAltitude*3.281)))"
                }
                if let maxDistance = totalMotions.max(\.distance)?.distance {
                    maxTimeLabel.text = "\(String(format:"%.2f", Float(maxDistance)*0.6213/1000))"
                }
            } else {
                if let maxDistance = totalMotions.max(\.distance)?.distance {
                    maxDistanceLabel.text = "\(String(format:"%.2f", Float(maxDistance)*0.6213/1000))"
                }
                if let maxTime = totalMotions.max(\.length)?.length {
                    maxTimeLabel.toTimeType3(length: maxTime)
                }
            }
            totalDistanceLabel.text = "\(String(format:"%.2f", Float(totalMotions.sum(\.distance))*0.6213/1000))"
        }
 
        if let maxCalorie = totalMotions.max(\.calorie)?.calorie {
            maxCalorieLabel.text = "\(String(format:"%.2f", Float(maxCalorie)))"
        }
   
                
//        totalStepsLabel.text = "\(stepArray.sum(\.number))步"
        
        totalCalorieLabel.text = "\(String(format:"%.2f", Float(totalMotions.sum(\.calorie))))"
        totalTimeLabel.toTimeType3(length: totalMotions.sum(\.length))
        totalNumberLabel.text = "\(totalMotions.count)"
    }
    
    private func reloadSectionCell(_ section: Int) {
        motionList[section].isShow = !motionList[section].isShow
        tableView.reloadSections(IndexSet.init(integer: section), with: .automatic)
        if motionList[section].isShow {
            tableViewHeight.constant += CGFloat(motionList[section].motionArray.count*50)
        } else {
            tableViewHeight.constant -= CGFloat(motionList[section].motionArray.count*50)
        }
        
    }

}


extension RecordDetailVC: UITableViewDelegate, UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
        if section == motionList.count-1 {
            return 0.1
        }
        return 10
    }
    
    func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
        let footerView = UIView()
        footerView.backgroundColor = UIColor.rgbColorFromHex(0xF2F2F2)
//        print("???")
        return footerView
    }
//    func height
    
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 50
    }

    
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let headerView = RecordHeaderView(section: section, motion: motionList[section])
//        headerView.backgroundColor = .red
        headerView.headerClosure = {[weak self] section in
            self?.reloadSectionCell(section)
        }
        return headerView
    }
    
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return motionList.count
    }
    
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 50
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return motionList[section].isShow ? motionList[section].motionArray.count : 0
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "MotionRecordCell", for: indexPath) as! MotionRecordCell
        cell.device = device
        if motionList[indexPath.section].isShow {
            cell.motion = motionList[indexPath.section].motionArray[indexPath.row]
        }
        
        return cell
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let vc = UIStoryboard.loadViewControllerIdentifier(storyboardName: "Motion", identifier: "EndMotionVC") as! EndMotionVC
        vc.modalPresentationStyle = .fullScreen
        let motion = motionList[indexPath.section].motionArray[indexPath.row]
        var coordinateArray: [CLLocationCoordinate2D] = []
        let coordinateStrArray = motion.coordinateArray.split(separator: "|")
        for coordinateStr in coordinateStrArray {
            let coordinateSub = String(coordinateStr).split(separator: ",")
            if coordinateSub.count == 2 {
                coordinateArray.append(CLLocationCoordinate2D(latitude: CLLocationDegrees(Float(coordinateSub[0])!), longitude: CLLocationDegrees(Float(coordinateSub[1])!)))
            }
        }
        
        var speedArray: [Float] = []
        let speedStrArray = motion.speedArray
        for speed in speedStrArray.split(separator: "|") {
            speedArray.append(Float("\(speed)")!)
        }
        
        var stepCadenceArray: [Int] = []
        let stepCadenceStrArray = motion.stepCadenceArray
        for stepCadence in stepCadenceStrArray.split(separator: "|") {
            stepCadenceArray.append(Int("\(stepCadence)")!)
        }
        
        var altitudeArray: [Double] = []
        let altitudeStrArray = motion.altitudeArray
        for altitude in altitudeStrArray.split(separator: "|") {
            altitudeArray.append(Double("\(altitude)")!)
        }

        vc.coordinateArray = coordinateArray
        vc.calorie = motion.calorie
        vc.distance = Float(motion.distance)
        vc.length = motion.length
        vc.date = motion.date
        vc.speedArray = speedArray
        vc.isRecordPresent = true
        vc.motionType = motion.type!
        vc.stepCadenceArray = stepCadenceArray
        vc.altitudeArray = altitudeArray
        vc.altitude = motion.altitude
        self.present(vc, animated: true, completion: nil)
    }
}