//
//  UmpireView.swift
//  PadelClub
//
//  Created by Razmig Sarkissian on 01/03/2024.
//

import SwiftUI
import CoreLocation
import LeStorage

struct UmpireView: View {
    
    @Environment(NavigationViewModel.self) private var navigation: NavigationViewModel
    @EnvironmentObject var dataStore: DataStore
    
    @State private var presentSearchView: Bool = false
    @State private var showSubscriptions: Bool = false
    
//    @State var isConnected: Bool = false
    
    enum UmpireScreen {
        case login
    }
    
    var body: some View {
        @Bindable var navigation = navigation
        NavigationStack(path: $navigation.umpirePath) {
            List {
                
                PurchaseListView()

                if Guard.main.currentPlan != .monthlyUnlimited {
                    Section {
                        Button {
                            self.showSubscriptions = true
                        } label: {
                            Label("Les offres", systemImage: "bookmark.fill")
                        }
                    }
                }
                
                if self._isConnected() {
                    NavigationLink {
                        AccountView(user: dataStore.user) {  }
                    } label: {
                        AccountRowView(userName: dataStore.user.username)
                    }
                } else {
                    NavigationLink(value: UmpireScreen.login) {
                        AccountRowView(userName: dataStore.user.username)
                    }
                }
                
                let currentPlayerData = dataStore.user.currentPlayerData()
                Section {
                    if let currentPlayerData {
                        //todo palmares
                        ImportedPlayerView(player: currentPlayerData)
//                        NavigationLink {
//                            
//                        } label: {
//                            ImportedPlayerView(player: currentPlayerData)
//                        }
                    } else {
                        RowButtonView("Ma fiche joueur", systemImage: "person.bust") {
                            presentSearchView = true
                        }
                    }
                } footer: {
                    if dataStore.user.licenceId == nil {
                        Text("Si vous avez participé à un tournoi dans les 12 derniers mois, Padel Club peut vous retrouver.")
                    } else if let currentPlayerData {
                        Menu {
                            Button {
                                UIPasteboard.general.string = currentPlayerData.formattedLicense()
                            } label: {
                                Text("Copier ma licence")
                                Text(currentPlayerData.formattedLicense())
                            }
                            
                            Button("Supprimer ma fiche") {
                                dataStore.user.licenceId = nil
                                self.dataStore.saveUser()
                            }

                        } label: {
                            Text("options")
                                .foregroundStyle(Color.master)
                                .underline()
                        }
                    }
                }
                
                Section {
                    NavigationLink {
                        ClubsView()
                    } label: {
                        LabeledContent {
                            Text(dataStore.user.clubs.count.formatted())
                        } label: {
                            Label("Clubs favoris", systemImage: "house.and.flag")
                        }
                    }
                } footer: {
                    Text("Il s'agit des clubs qui sont utilisés pour récupérer les tournois tenup.")
                }
                

                Section {
                    NavigationLink {
                        GlobalSettingsView()
                    } label: {
                        Label("Formats de jeu par défaut", systemImage: "megaphone")
                    }
                    NavigationLink {
                        DurationSettingsView()
                    } label: {
                        Label("Définir les durées moyennes", systemImage: "deskclock")
                    }
                } footer: {
                    Text("Vous pouvez définir vos propres estimations de durées de match en fonction du format de jeu.")
                }
                
//                Section {
//                    Text("Tenup ID")
//                }
//
//                Section {
//                    Text("Tournois")
//                }
//
//                Section {
//                    NavigationLink {
//
//                    } label: {
//                        Text("Favori")
//                    }
//                    NavigationLink {
//
//                    } label: {
//                        Text("Black list")
//                    }
//                }
            }
            .navigationTitle("Juge-Arbitre")
            .toolbar {
#if DEBUG
                ToolbarItem(placement: .topBarTrailing) {
                    if StoreCenter.main.collectionsCanSynchronize {
                        Image(systemName: "checkmark.icloud")
                    } else {
                        Image(systemName: "icloud.slash")
                    }
                }
#endif
            }
            .sheet(isPresented: self.$showSubscriptions, content: {
                NavigationStack {
                    SubscriptionView(isPresented: self.$showSubscriptions)
                        .environment(\.colorScheme, .light)
                }
            })
            .sheet(isPresented: $presentSearchView) {
                let user = dataStore.user
                NavigationStack {
                    SelectablePlayerListView(allowSelection: 1, searchField: user.firstName + " " + user.lastName, playerSelectionAction: { players in
                        if let player = players.first {
                            user.licenceId = player.license
                            if user.clubsObjects().contains(where: { $0.code == player.clubCode }) == false {
                                let userClub = Club.findOrCreate(name: player.clubName!, code: player.clubCode)
                                if userClub.hasBeenCreated(by: StoreCenter.main.userId) {
                                    do {
                                        try dataStore.clubs.addOrUpdate(instance: userClub)
                                    } catch {
                                        Logger.error(error)
                                    }
                                }
                                user.setUserClub(userClub)
                            }
                            self.dataStore.saveUser()
                        }
                    })
                }
                .task {
                    do {
                        try await dataStore.clubs.loadDataFromServerIfAllowed()
                    } catch {
                        Logger.error(error)
                    }
                }
            }
            .navigationDestination(for: UmpireScreen.self) { screen in
                switch screen {
                case .login:
                    LoginView {_ in }
                }
            }
        }
    }
    
    fileprivate func _isConnected() -> Bool {
        return dataStore.user.username.count > 0 && StoreCenter.main.hasToken()
    }

}

struct AccountRowView: View {
    @EnvironmentObject var dataStore: DataStore

    var userName: String
    var body: some View {
        
        let hasToken = StoreCenter.main.hasToken()
        LabeledContent {
            if hasToken {
                Text(self.userName)
            } else if StoreCenter.main.userName() != nil {
                Image(systemName: "xmark.circle.fill")
                    .foregroundStyle(.logoRed)
            }
        } label: {
            Label("Mon compte", systemImage: "person.fill")
            if hasToken && dataStore.user.email.isEmpty == false {
                Text(dataStore.user.email)
            }
        }
    }
}

//#Preview {
//    UmpireView()
//}
