/*
* Copyright (c) 2020, Nordic Semiconductor
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
*    list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this
*    list of conditions and the following disclaimer in the documentation and/or
*    other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may
*    be used to endorse or promote products derived from this software without
*    specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/



import UIKit
import CoreBluetooth

extension Identifier where Value == Section {
    static let bloodPressure: Identifier<Section> = "bloodPressure"
    static let cuffPressure: Identifier<Section> = "cuffPressure"
    static let dateTime: Identifier<Section> = "TimeBloodPressureSection"
    static let heartRate: Identifier<Section> = "HeartRate"
}

class BloodPressureTableViewController: PeripheralTableViewController {
    private var bloodPressureSection = BloodPressureSection(id: .bloodPressure)
    private var cuffPressureSection = CuffPressureSection(id: .cuffPressure)
    private var dateTimeSection = TimeBloodPressureSection(id: .dateTime)
    private var heartRateSection = PulseBloodPressureSection(id: .heartRate)
    
    override var internalSections: [Section] { [bloodPressureSection, heartRateSection, dateTimeSection, cuffPressureSection] }
    override var peripheralDescription: PeripheralDescription { . bloodPressure }
    
    private var dataSectionIds: [Identifier<Section>] = [.bloodPressure, .cuffPressure]
    override var navigationTitle: String { "Blood Pressure" }

    override func didDiscover(service: CBService, for peripheral: CBPeripheral) {
        super.didDiscover(service: service, for: peripheral)
        
        if service.uuid == CBUUID.Service.bloodPressureMonitor {
            
        }
    }

    override func didUpdateValue(for characteristic: CBCharacteristic) {
        guard let value = characteristic.value else {
            super.didUpdateValue(for: characteristic)
            return
        }
        switch characteristic.uuid {
        case CBUUID.Characteristics.BloodPressure.measurement:
            do {
                let bloodPressureCharacteristic = try BloodPressureCharacteristic(data: value)
                bloodPressureSection.update(with: bloodPressureCharacteristic)
                heartRateSection.update(with: bloodPressureCharacteristic)
                dateTimeSection.update(with: bloodPressureCharacteristic)
                
                tableView.reloadData()
            } catch let error {
                displayErrorAlert(error: error)
            }

        case CBUUID.Characteristics.BloodPressure.intermediateCuff:
            do {
                let cuffCharacteristic = try CuffPressureCharacteristic(data: value)
                cuffPressureSection.update(with: cuffCharacteristic)
            } catch let error {
                displayErrorAlert(error: error)
            }

            tableView.reloadData()
        default:
            super.didUpdateValue(for: characteristic)
        }
    }

}
