//
//  SharingView.swift
//  Feels (iOS)
//
//  Created by Trey Tartt on 2/6/22.
//

import SwiftUI

struct WrappedSharable: Hashable, Equatable {
    static func == (lhs: WrappedSharable, rhs: WrappedSharable) -> Bool {
        lhs.id == rhs.id && lhs.description == rhs.description
    }
    
    func hash(into hasher: inout Hasher) {
        hasher.combine(id)
    }
    
    let id = UUID()
    let preview: AnyView
    let destination: AnyView
    let description: String
}

struct SharingListView: View {
    @AppStorage(UserDefaultsStore.Keys.theme.rawValue, store: GroupUserDefaults.groupDefaults) private var theme: Theme = .system
    @AppStorage(UserDefaultsStore.Keys.textColor.rawValue, store: GroupUserDefaults.groupDefaults) private var textColor: Color = DefaultTextColor.textColor

    class StupidAssObservableObject: ObservableObject {
        @Published var fuckingWrappedShrable: WrappedSharable? = nil
        @Published var showFuckingSheet = false
    }

    @StateObject private var selectedShare = StupidAssObservableObject()
    var sharebleItems =  [WrappedSharable]()
    
    init() {
        self.sharebleItems = [
            WrappedSharable(preview: AnyView(
                AllMoodsTotalTemplate(isPreview: true,
                                      startDate: PersistenceController.shared.earliestEntry?.forDate ?? Date(),
                                      endDate: Date(),
                                      fakeData: false)
            ),destination: AnyView(
                AllMoodsTotalTemplate(isPreview: false,
                                      startDate: PersistenceController.shared.earliestEntry?.forDate ?? Date(),
                                      endDate: Date(),
                                      fakeData: false)
            ),description: AllMoodsTotalTemplate.description),
            //////////////////////////////////////////////////////////
            WrappedSharable(preview: AnyView(
                CurrentStreakTemplate(isPreview: true,
                                      startDate: Calendar.current.date(byAdding: .day, value: -10, to: Date())!,
                                      endDate: Date(),
                                      fakeData: false)
            ), destination: AnyView(
                CurrentStreakTemplate(isPreview: false,
                                      startDate: Calendar.current.date(byAdding: .day, value: -10, to: Date())!,
                                      endDate: Date(),
                                      fakeData: false)
            ), description: CurrentStreakTemplate.description),
            //////////////////////////////////////////////////////////
            WrappedSharable(preview: AnyView(
                LongestStreakTemplate(isPreview: true,
                                      startDate: PersistenceController.shared.earliestEntry?.forDate ?? Date(),
                                      endDate: Date(),
                                      fakeData: false)
            ), destination: AnyView(
                LongestStreakTemplate(isPreview: false,
                                      startDate: PersistenceController.shared.earliestEntry?.forDate ?? Date(),
                                      endDate: Date(),
                                      fakeData: false)
            ), description: LongestStreakTemplate.description),
            //////////////////////////////////////////////////////////
            WrappedSharable(preview: AnyView(
                MonthTotalTemplate(isPreview: true,
                                   startDate: Date().startOfMonth,
                                   endDate: Date().endOfMonth,
                                   fakeData: false)
            ), destination: AnyView(
                MonthTotalTemplate(isPreview: false,
                                   startDate: Date().startOfMonth,
                                   endDate: Date().endOfMonth,
                                   fakeData: false)
            ), description: MonthTotalTemplate.description)
            //////////////////////////////////////////////////////////
        ]
    }
    
   
    
    func didDismiss() {
        selectedShare.showFuckingSheet = false
        selectedShare.fuckingWrappedShrable = nil
    }
    
    var body: some View {
        VStack {
            ScrollView {
                ForEach(sharebleItems, id: \.self) { item in
                    Button(action: {
                        selectedShare.fuckingWrappedShrable = item
                        selectedShare.showFuckingSheet = true
                    }, label: {
                        ZStack {
                            theme.currentTheme.secondaryBGColor
                            
                            item.preview
                                .frame(height: 88)
                            
                            VStack {
                                Spacer()
                                Text(item.description)
                                    .font(.title)
                                    .foregroundColor(textColor)
                                    .fontWeight(.bold)
                                    .frame(minWidth: 0, maxWidth: .infinity)
                                    .frame(height: 44)
                                    .background(
                                        theme.currentTheme.secondaryBGColor
                                    )
                                    .opacity(0.9)
                            }
                        }
                        .frame(height: 88)
                        .cornerRadius(Constants.viewsCornerRaidus, corners: [.topLeft, .topRight, .bottomLeft, .bottomRight])
                        .scaledToFill()
                        .clipped()
                        .contentShape(Path(CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 88)))
                        .padding([.leading, .trailing])
                    })
                }
                
            }
        }
        .padding([.top, .bottom])
        .background(
            theme.currentTheme.bg
                .edgesIgnoringSafeArea(.top)
        )
        .sheet(isPresented: $selectedShare.showFuckingSheet,
               onDismiss: didDismiss) {
            selectedShare.fuckingWrappedShrable?.destination
        }
    }
    
    func share(image: UIImage) {
        
    }
}

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