//
//  TournamentStatusView.swift
//  PadelClub
//
//  Created by Razmig Sarkissian on 01/05/2024.
//

import SwiftUI
import LeStorage

struct TournamentStatusView: View {
    @Environment(\.dismiss) private var dismiss
    @Environment(Tournament.self) private var tournament: Tournament
    @Environment(NavigationViewModel.self) private var navigation: NavigationViewModel
    @EnvironmentObject var dataStore: DataStore
    
    var body: some View {
        @Bindable var tournament = tournament
        Form {
            #if DEBUG
            RowButtonView("debug: Un-delete le tournoi") {
                tournament.endDate = nil
                tournament.isDeleted.toggle()
            }
            #endif
            
            Section {
                if tournament.endDate == nil {
                    RowButtonView("Terminer le tournoi", role: .destructive) {
                        tournament.endDate = Date()
                    }
                } else {
                    RowButtonView("Ré-ouvrir le tournoi", role: .destructive) {
                        tournament.endDate = nil
                    }
                }
            } footer: {
                if tournament.endDate == nil {
                    Text("Indique une date de fin pour le tournoi. Il sera considéré terminé.")
                } else {
                    Text("Retire la date de fin du tournoi. Il sera considéré en cours.")
                }
            }
            
            Section {
                RowButtonView("Supprimer le tournoi", role: .destructive) {
                    if tournament.payment == nil {
                        do {
                            try dataStore.tournaments.delete(instance: tournament)
                        } catch {
                            Logger.error(error)
                        }
                    } else {
                        tournament.endDate = Date()
                        tournament.isDeleted = true
                        tournament.navigationPath.removeAll()
                        do {
                            try dataStore.tournaments.addOrUpdate(instance: tournament)
                        } catch {
                            Logger.error(error)
                        }
                    }
                    navigation.path = NavigationPath()
                }
            } footer: {
                if tournament.payment == nil {
                    Text("")
                }
            }
            
            if tournament.hasEnded() == false && tournament.isCanceled == false {
                Section {
                    RowButtonView("Annuler le tournoi", role: .destructive) {
                        tournament.endDate = Date()
                        tournament.isCanceled = true
                        do {
                            try dataStore.tournaments.addOrUpdate(instance: tournament)
                        } catch {
                            Logger.error(error)
                        }
                        dismiss()
                    }
                } footer: {
                    Text(.init("Si votre tournoi n'a pas pu aboutir à cause de la météo ou autre, vous pouvez l'annuler et il ne sera pas comptabilisé. Toutes les données du tournoi seront conservées. Le tournoi visible sur [Padel Club](\(URLs.main.rawValue))"))
                }
            }
            
            Section {
                Toggle(isOn: $tournament.isPrivate) {
                    Text("Tournoi privé")
                }
            } footer: {
                Text(.init("Le tournoi sera masqué sur le site [Padel Club](\(URLs.main.rawValue))"))
            }
        }
        .toolbarBackground(.visible, for: .navigationBar)
        .onChange(of: tournament.endDate) {
            _save()
        }
        .onChange(of: [tournament.isDeleted, tournament.isPrivate]) {
            _save()
        }
        .onChange(of: tournament.isCanceled) {
            _save()
        }
    }
    
    private func _save() {
        do {
            try dataStore.tournaments.addOrUpdate(instance: tournament)
        } catch {
            Logger.error(error)
        }
    }
}

//#Preview {
//    TournamentStatusView()
//}
