//
//  GraphView.swift
//  Feels
//
//  Created by Trey Tartt on 1/8/22.
//

import Foundation
import SwiftUI
import CoreData
import Charts

struct GraphView: View {
    var body: some View {
        ZStack {
            Color(UIColor.secondarySystemBackground)
            VStack {
                VStack {
                    HStack {
                        ZStack {
                            Color(UIColor.systemBackground)
                            BarChartGraph(entries: [
                                BarChartDataEntry(x: 1, y: Double(Int.random(in: 0...10))),
                                BarChartDataEntry(x: 2, y: Double(Int.random(in: 0...10))),
                                BarChartDataEntry(x: 3, y: Double(Int.random(in: 0...10))),
                                BarChartDataEntry(x: 4, y: Double(Int.random(in: 0...10))),
                                BarChartDataEntry(x: 5, y: Double(Int.random(in: 0...10)))
                            ])
                        }
                        .cornerRadius(10, corners: [.topLeft, .topRight, .bottomLeft, .bottomRight])
                        .padding()
                        
                        ZStack {
                            Color(UIColor.systemBackground)
                            BarChartGraph(entries: [
                                BarChartDataEntry(x: 1, y: Double(Int.random(in: 0...10))),
                                BarChartDataEntry(x: 2, y: Double(Int.random(in: 0...10))),
                                BarChartDataEntry(x: 3, y: Double(Int.random(in: 0...10))),
                                BarChartDataEntry(x: 4, y: Double(Int.random(in: 0...10))),
                                BarChartDataEntry(x: 5, y: Double(Int.random(in: 0...10)))
                            ])
                        }
                        .cornerRadius(10, corners: [.topLeft, .topRight, .bottomLeft, .bottomRight])
                        .padding()
                    }
                    
                    ZStack {
                        Color(UIColor.systemBackground)
                        BarChartGraph(entries: [
                            BarChartDataEntry(x: 1, y: Double(Int.random(in: 0...10))),
                            BarChartDataEntry(x: 2, y: Double(Int.random(in: 0...10))),
                            BarChartDataEntry(x: 3, y: Double(Int.random(in: 0...10))),
                            BarChartDataEntry(x: 4, y: Double(Int.random(in: 0...10))),
                            BarChartDataEntry(x: 5, y: Double(Int.random(in: 0...10)))
                        ])
                    }
                    .cornerRadius(10, corners: [.topLeft, .topRight, .bottomLeft, .bottomRight])
                        .padding()
                    
                    ZStack {
                        Color(UIColor.systemBackground)
                        BarChartGraph(entries: [
                            BarChartDataEntry(x: 1, y: Double(Int.random(in: 0...10))),
                            BarChartDataEntry(x: 2, y: Double(Int.random(in: 0...10))),
                            BarChartDataEntry(x: 3, y: Double(Int.random(in: 0...10))),
                            BarChartDataEntry(x: 4, y: Double(Int.random(in: 0...10))),
                            BarChartDataEntry(x: 5, y: Double(Int.random(in: 0...10)))
                        ])
                    }
                    .cornerRadius(10, corners: [.topLeft, .topRight, .bottomLeft, .bottomRight])
                        .padding()
                }
            }
        }
    }
}

struct BarChartGraph: UIViewRepresentable {
    //Bar chart accepts data as array of BarChartDataEntry objects
    var entries : [BarChartDataEntry]
    
    // this func is required to conform to UIViewRepresentable protocol
    func makeUIView(context: Context) -> BarChartView {
        //crate new chart
        let chart = BarChartView()
        chart.drawGridBackgroundEnabled = false
        chart.drawValueAboveBarEnabled = false
        
        chart.xAxis.drawAxisLineEnabled = false
        chart.xAxis.labelTextColor = .clear
        
        chart.rightAxis.drawAxisLineEnabled = false
        chart.rightAxis.labelTextColor = .clear
        
        chart.leftAxis.drawAxisLineEnabled = false
        chart.leftAxis.labelTextColor = .clear
        
        chart.xAxis.drawGridLinesEnabled = false
        chart.leftAxis.drawGridLinesEnabled = false
        chart.leftAxis.axisLineColor = .clear
        chart.rightAxis.axisLineColor = .clear
        
        chart.legend.textColor = .clear
        chart.legend.enabled = false
        
        chart.drawBordersEnabled = false
        chart.drawMarkers = false
        //        chart.yAxis.drawGridLinesEnabled = false
        chart.rightAxis.drawGridLinesEnabled = false
        chart.borderColor = .clear
        //it is convenient to form chart data in a separate func
        chart.data = addData()
        return chart
    }
    
    // this func is required to conform to UIViewRepresentable protocol
    func updateUIView(_ uiView: BarChartView, context: Context) {
        //when data changes chartd.data update is required
        uiView.data = addData()
    }
    
    func addData() -> BarChartData{
        let data = BarChartData()
        //BarChartDataSet is an object that contains information about your data, styling and more
        let dataSet = BarChartDataSet(entries: entries)
        // change bars color to green
        dataSet.colors = [NSUIColor.green]
        //change data label
        data.append(dataSet)
        return data
    }
    
    typealias UIViewType = BarChartView
}


struct GraphView_Previews: PreviewProvider {
    static var previews: some View {
        Group {
            GraphView()
            
            GraphView()
                .preferredColorScheme(.dark)
        }
    }
}
