//
//  SwitchableView.swift
//  Feels (iOS)
//
//  Created by Trey Tartt on 1/30/22.
//

import SwiftUI

enum MainSwitchableViewType: Int, CaseIterable {
    case total
    case percentageShape
    case percentage
    
    func next() -> MainSwitchableViewType {
        let currentValue = self.rawValue
        var next = currentValue + 1
        if next == MainSwitchableViewType.allCases.count {
            next = 0
        }
        return MainSwitchableViewType(rawValue: next) ?? .total
    }
}

struct SwitchableView: View {
    @Binding var viewType: MainSwitchableViewType
    var headerTypeChanged: ((MainSwitchableViewType) -> Void)
    let daysBack: Int

    @AppStorage(UserDefaultsStore.Keys.theme.rawValue, store: GroupUserDefaults.groupDefaults) private var theme: Theme = .system
    @AppStorage(UserDefaultsStore.Keys.moodTint.rawValue, store: GroupUserDefaults.groupDefaults) private var moodTint: MoodTints = .Default
    @AppStorage(UserDefaultsStore.Keys.textColor.rawValue, store: GroupUserDefaults.groupDefaults) private var textColor: Color = .white
    
    // store a value that gets changed when user updates custom colors to update the view since the moodTint doesn't change
    @AppStorage(UserDefaultsStore.Keys.customMoodTintUpdateNumber.rawValue, store: GroupUserDefaults.groupDefaults) private var customMoodTintUpdateNumber: Int = 0
    
    init(daysBack: Int, viewType: Binding<MainSwitchableViewType>, headerTypeChanged: @escaping ((MainSwitchableViewType) -> Void)) {
        self.daysBack = daysBack
        self.headerTypeChanged = headerTypeChanged
        self._viewType = viewType
    }
    
    private var mainViews: some View {
        switch viewType {
        case .total:
            return AnyView(
                HeaderStatsView(fakeData: false, backDays: daysBack, moodTint: [
                    moodTint.color(forMood: .great),
                    moodTint.color(forMood: .good),
                    moodTint.color(forMood: .average),
                    moodTint.color(forMood: .bad),
                    moodTint.color(forMood: .horrible)
                ], textColor: textColor))
            .allowsHitTesting(false)
        case .percentageShape:
            return AnyView(
                HeaderPercView(fakeData: false, backDays: daysBack, type: .shape))
            .allowsHitTesting(false)
        case .percentage:
            return AnyView(
                HeaderPercView(fakeData: false, backDays: daysBack, type: .text))
            .allowsHitTesting(false)
        }
    }
    
    var body: some View {
        VStack {
            ZStack {
                Text(String(customMoodTintUpdateNumber))
                    .hidden()
                
                mainViews
                    .padding([.top, .bottom])
                
                VStack {
                    HStack {
                        Spacer()
                        Image(systemName: "arrow.triangle.2.circlepath.circle")
                            .resizable()
                            .frame(width: 20, height: 20, alignment: .trailing)
                    }
                    Spacer()
                }
                .padding(.trailing, 8)
                .padding(.top, 12)
                .allowsHitTesting(false)
                .foregroundColor(Color(UIColor.systemGray))
            }
            .padding(.top, -7)

            Text(String(format: String(localized: "content_view_header_title"), daysBack))
                .font(.body)
                .foregroundColor(Color(UIColor.systemGray))
                .frame(maxWidth: .infinity, alignment: .center)
                .padding(.top, -12)
        }
        .background(
            theme.currentTheme.secondaryBGColor
        )
        .contentShape(Rectangle())
        .cornerRadius(Constants.viewsCornerRaidus, corners: [.topLeft, .topRight, .bottomLeft, .bottomRight])
        .padding(.bottom, 30)
        .onTapGesture {
            viewType = viewType.next()
            self.headerTypeChanged(viewType)
            EventLogger.log(event: "switchable_view_header_changed",
                            withData: ["view_type_id": viewType.rawValue, "days_back": daysBack])
        }
    }
}

struct SwitchableView_Previews: PreviewProvider {
    static var previews: some View {
        SwitchableView(daysBack: 30, viewType: .constant(.total), headerTypeChanged: { _ in
        })
    }
}
