//
//  Tips.swift
//  Padel Tournament
//
//  Created by Razmig Sarkissian on 18/12/2023.
//

import Foundation
import TipKit

struct PadelBeachExportTip: Tip {
    var title: Text {
        Text("Inscrire les équipes sur le site fédéral")
    }


    var message: Text? {
        Text("Allez sur beach-padel.app.fft.fr pour y inscrire les paires que vous avez préparé.")
    }

    var image: Image? {
        Image(systemName: "square.and.arrow.up")
    }
    
    var actions: [Action] {
        Action(id: "more-info-export", title: "En savoir plus")
        Action(id: "beach-padel", title: "beach-padel.app.fft.fr")
    }

}

struct PadelBeachImportTip: Tip {
    var title: Text {
        Text("Importer les paires du site fédéral")
    }


    var message: Text? {
        Text("Allez sur beach-padel.app.fft.fr pour exporter les paires que vous avez inscrites, puis importer le fichier dans Padel Club")
    }

    var image: Image? {
        Image(systemName: "square.and.arrow.down")
    }
    
    var actions: [Action] {
        Action(id: "more-info-import", title: "Importer le fichier excel beach-padel")
    }
}

struct GenerateLoserBracketTip: Tip {
    var title: Text {
        Text("Générer les matchs de classements")
    }


    var message: Text? {
        Text("Si vous êtes satisfait de votre tableau, vous pouvez générer les matchs de classements pour faciliter la gestion de votre programmation. L'option est disponible dans le menu en haut à droite.")
    }

    var image: Image? {
        nil
    }
    
    
    var actions: [Action] {
        Action(id: "generate-loser-bracket", title: "Générer les matchs de classements")
    }

}


struct TeamChampionshipTip: Tip {
    var title: Text {
        Text("Gérer vos rencontres du championnat par équipe")
    }


    var message: Text? {
        Text("Padel Club vous permet de gérer vos équipes, préparer vos paires pour les rencontres, calculer leurs poids, vérifier la validité des jokers, noter les scores et diffuser les résultats.")
    }

    var image: Image? {
        Image(systemName: "person.3")
    }
    
    var actions: [Action] {
        Action(id: "list-manager", title: "Ouvrir le gestionnaire d'équipe")
    }

}


struct TeamChampionshipMainScreenTip: Tip {
    var title: Text {
        Text("Affichage sur l'écran principal")
    }


    var message: Text? {
        Text("Afficher l'accès au gestionnaire d'équipe sur l'écran principal. Vous pourrez le modifier plus tard dans les options en haut à droite de cet écran.")
    }

    var image: Image? {
        Image(systemName: "arrow.uturn.backward")
    }
    
    var actions: [Action] {
        Action(id: "set-list-manager-main", title: "Afficher sur l'écran principal")
    }

}

struct InscriptionManagerPasteInputTip: Tip {
    var title: Text {
        Text("Copier / Coller")
    }


    var message: Text? {
        Text("Copiez les messages d'inscriptions que vous recevez, que ce soit SMS, email, WhatsApp ou autre, puis utilisez le bouton pour le coller, Padel Club se chargera de vous proposer les joueurs détectés dans le message.")
    }

    var image: Image? {
        Image(systemName: "doc.on.clipboard")
    }

    var actions: [Action] {
        Action(id: "add-team-paste", title: "Collez le contenu du presse-papier")
    }
}

struct InscriptionManagerSearchInputTip: Tip {
    var title: Text {
        Text("Rechercher dans la base fédérale")
    }


    var message: Text? {
        Text("Padel Club contient la base fédérale public de tous les joueurs ayant déjà participé à au moins un tournoi. Ajouter rapidement une équipe grâce à cette fonction.")
    }

    var image: Image? {
        Image(systemName: "magnifyingglass")
    }

    var actions: [Action] {
        Action(id: "add-team-search", title: "Chercher dans la base fédérale")
    }
}


struct InscriptionManagerCreateInputTip: Tip {
    var title: Text {
        Text("Créer un joueur manuellement")
    }


    var message: Text? {
        Text("Si le joueur est introuvable, cela indique qu'il n'a jamais fait de compétition, rajoutez-le rapidement manuellement. Padel Club calcul le rang du non-classé de ce mois-ci automatiquement.")
    }

    var image: Image? {
        Image(systemName: "person.badge.plus")
    }

    var actions: [Action] {
        Action(id: "add-team-create", title: "Créer un ou une joueuse")
    }
}

struct InscriptionManagerFileInputTip: Tip {
    var title: Text {
        Text("Importer le fichier beach-padel.app.fft.fr")
    }


    var message: Text? {
        Text("Padel Club vous permet d'importer le fichier excel fourni par beach-padel.app.fft.fr")
    }

    var image: Image? {
        Image(systemName: "doc")
    }

    var actions: [Action] {
        Action(id: "add-team-file", title: "Choisir un fichier")
        Action(id: "website", title: "Aller sur beach-padel.app.fft.fr")
    }
}

struct InscriptionManagerWomanRankTip: Tip {
    var image: Image? {
        Image(systemName: "figure.dress.line.vertical.figure")
    }
    
    var title: Text {
        Text("Rang d'une joueuse dans un tournoi messieurs")
    }


    var message: Text? {
        Text("Padel Club calcul automatiquement le rang d'une joueuse inscrite dans un tournoi messieurs.")
    }
}

struct InscriptionManagerRankUpdateTip: Tip {
    var title: Text {
        Text("Nouveau classement disponible")
    }


    var message: Text? {
        Text("Padel Club vous permet de mettre à jour le classement des équipes inscrites. Si vous avez clôturé les inscriptions, la mise à jour du classement ne modifie pas la phase d'intégration de l'équipe, poule ou tableau final. Vous pouvez manuellement mettre à jour cette option.")
    }
    
    var image: Image? {
        Image(systemName: "list.number")
    }

    var actions: [Action] {
        Action(id: "update-rank", title: "Mettre à jour les classements")
    }

}

struct SharePictureTip: Tip {
    var title: Text {
        Text("Partage d'un match avec une photo")
    }

    var message: Text? {
        Text("Lors d'un partage d'une photo, le texte est disponible dans le presse-papier du téléphone")
    }
    
    var image: Image? {
        Image(systemName: "photo.badge.checkmark.fill")
    }
}

struct NewRankDataAvailableTip: Tip {
    var title: Text {
        Text("Nouveau classement disponible")
    }

    var message: Text? {
        Text("Padel Club récupère toutes les données publique provenant de la FFT. L'importation de ce nouveau classement peut prendre plusieurs dizaines de secondes.")
    }
    
    var image: Image? {
        Image(systemName: "exclamationmark.icloud")
    }

    var actions: [Action] {
        //Action(id: "show-rank", title: Padel_TournamentApp.padelRankingWebsite.absoluteString)
        Action(id: "update-rank", title: "Démarrer l'importation")
    }

}

struct ClubSearchTip: Tip {
    var title: Text {
        Text("Recherche d'un club")
    }

    var message: Text? {
        Text("Padel Club peut rechercher un club autour de vous, d'une ville ou d'un code postal, facilitant ainsi la saisie d'information.")
    }
    
    var image: Image? {
        Image(systemName: "house.and.flag.fill")
    }

    var actions: [Action] {
        Action(id: ActionKey.searchAroundMe.rawValue, title: "Chercher autour de moi")
        Action(id: ActionKey.searchCity.rawValue, title: "Chercher une ville")
    }
    
    enum ActionKey: String {
        case searchAroundMe = "search-around-me"
        case searchCity = "search-city"

    }
}

struct SlideToDeleteTip: Tip {
    var title: Text {
        Text("Glisser pour effacer")
    }

    var message: Text? {
        Text("Vous pouvez effacer un club en glissant votre doigt vers la gauche")
    }
    
    var image: Image? {
        Image(systemName: "trash")
    }

}

struct MultiTournamentsEventTip: Tip {
    var title: Text {
        Text("Plusieurs tournois le même week-end ?")
    }

    var message: Text? {
        Text("Padel Club permet de gérer plusieurs tournois ayant lieu en même temps. Un P100 homme et dame le même week-end par exemple.")
    }
    
    var image: Image? {
        Image(systemName: "trophy.circle")
    }
}

struct NotFoundAreWalkOutTip: Tip {
    var title: Text {
        Text("Gestion des équipes manquantes")
    }

    var message: Text? {
        Text("Si une équipe déjà présente dans votre liste d'attente n'est pas dans le fichier, elle sera mise WO")
    }
    
    var image: Image? {
        Image(systemName: "person.2.slash.fill")
    }
}

struct TournamentPublishingTip: Tip {
    var title: Text {
        Text("Gestion de la publication")
    }

    enum ActionKey: String {
        case showPadelClub = "show-padel-club"
    }

    var message: Text? {
        Text("Padel Club vous permet de publier votre tournoi et rendre accessible à tous les résultats des matchs et l'évolution de l'événement. Les informations seront accessibles sur le site Padel Club.")
    }
    
    var image: Image? {
        Image("PadelClub_logo_fondclair_transparent")
    }
}

struct TournamentTVBroadcastTip: Tip {
    var title: Text {
        Text("Lien TV")
    }

    var message: Text? {
        return Text("Padel Club vous propose un site spéficique à utiliser sur les écrans de votre club, présentant de manière intelligente l'évolution de votre tournoi.")
    }
    
    var image: Image? {
        Image(systemName: "sparkles.tv")
    }
}

struct TournamentSelectionTip: Tip {
    @Parameter
    static var tournamentCount: Int? = nil
    
    var rules: [Rule] {
        [
            // Define a rule based on the app state.
            #Rule(Self.$tournamentCount) {
                // Set the conditions for when the tip displays.
                return ($0 ?? 1) > 1
            }
        ]
    }

    var title: Text {
        Text("Naviguer entre les épreuves")
    }

    var message: Text? {
        return Text("Vous pouvez appuyer sur la barre de navigation pour accéder à une épreuve de votre événement.")
    }
    
    var image: Image? {
        Image(systemName: "filemenu.and.selection")
    }
}

struct TournamentRunningTip: Tip {
    @Parameter
    static var isRunning: Bool = false
    
    var rules: [Rule] {
        [
            // Define a rule based on the app state.
            #Rule(Self.$isRunning) {
                // Set the conditions for when the tip displays.
                return $0
            }
        ]
    }

    var title: Text {
        Text("Tournoi en cours")
    }

    var message: Text? {
        return Text("Le tournoi a commencé, les options utiles surtout à sa préparation sont maintenant accessibles dans le menu en haut à droite.")
    }
    
    var image: Image? {
        Image(systemName: "ellipsis.circle")
    }
}

struct CreateAccountTip: Tip {
    var title: Text {
        Text("Créer votre compte Padel Club")
    }

    var message: Text? {
        let message = "Un compte est nécessaire pour publier le tournoi sur [Padel Club](\(URLs.main.rawValue)) et profiter de toutes les pages du site, comme le mode TV pour transformer l'expérience de vos tournois !"
        return Text(.init(message))
    }
    
    var image: Image? {
        Image(systemName: "person.crop.circle")
    }
    
    var actions: [Action] {
        Action(id: ActionKey.createAccount.rawValue, title: "Créer votre compte")
        //todo
        //Action(id: ActionKey.learnMore.rawValue, title: "En savoir plus")
        Action(id: ActionKey.accessPadelClubWebPage.rawValue, title: "Jeter un oeil au site Padel Club")
    }
    
    enum ActionKey: String {
        case createAccount = "createAccount"
        case learnMore = "learnMore"
        case accessPadelClubWebPage = "accessPadelClubWebPage"
    }
}

struct SlideToDeleteSeedTip: Tip {
    @Parameter
    static var seeds: Int = 0
        
    var rules: [Rule] {
        [
            // Define a rule based on the app state.
            #Rule(Self.$seeds) {
                // Set the conditions for when the tip displays.
                return $0 > 0
            }
        ]
    }

    var title: Text {
        Text("Glisser pour effacer")
    }

    var message: Text? {
        Text("Vous pouvez retirer une tête de série de sa position en glissant votre doigt vers la gauche")
    }
    
    var image: Image? {
        Image(systemName: "person.fill.xmark")
    }
}

struct PrintTip: Tip {
    @Parameter
    static var seeds: Int = 0
        
    var rules: [Rule] {
        [
            // Define a rule based on the app state.
            #Rule(Self.$seeds) {
                // Set the conditions for when the tip displays.
                return $0 > 0
            }
        ]
    }
    
    var title: Text {
        Text("Coup d'oeil de votre tableau")
    }

    var message: Text? {
        Text("Vous pouvez avoir un aperçu de votre tableau ou l'imprimer.")
    }
    
    var image: Image? {
        Image(systemName: "printer")
    }

    var actions: [Action] {
        Action(id: ActionKey.printAction.rawValue, title: "Aperçu du tableau et option d'impression")
    }

    enum ActionKey: String {
        case printAction = "printAction"
    }
}

struct BracketEditTip: Tip {
    @Parameter
    static var matchesHidden: Int = 0
    
    var nextRoundName: String?
    
    var rules: [Rule] {
        [
            // Define a rule based on the app state.
            #Rule(Self.$matchesHidden) {
                // Set the conditions for when the tip displays.
                return $0 > 0
            }
        ]
    }

    var title: Text {
        Text("Désactivation automatique des matchs")
    }

    var message: Text? {
        let grammar = Self.matchesHidden == 1 ? "a" : "ont"
        let article = Self.matchesHidden == 1 ? "la" : "les"
        let wording = nextRoundName != nil ? "en \(nextRoundName!)" : "dans la manche suivante"
        return Text("Padel Club a bien pris en compte \(article) tête\(Self.matchesHidden.pluralSuffix) de série positionnée\(Self.matchesHidden.pluralSuffix) \(wording). Le\(Self.matchesHidden.pluralSuffix) \(Self.matchesHidden) match\(Self.matchesHidden.pluralSuffix) inutile\(Self.matchesHidden.pluralSuffix) \(grammar) été désactivé automatiquement.")
    }
    
    var image: Image? {
        Image(systemName: "rectangle.slash")
    }
}

struct TipStyleModifier: ViewModifier {
    @Environment(\.colorScheme) var colorScheme
    var tint: Color?
    var background: Color?
    var asSection: Bool
    
    func body(content: Content) -> some View {
        if asSection {
            Section {
                preparedContent(content: content)
            }
        } else {
            preparedContent(content: content)
        }
    }
        
    @ViewBuilder
    func preparedContent(content: Content) -> some View {
        if let background {
            content
                .tint(.white)
                .listRowInsets(EdgeInsets())
                .tipBackground(background)
        } else if let tint {
            if colorScheme == .light {
                content
                    .tint(tint)
                    .listRowInsets(EdgeInsets())
                    .tipBackground(.white)
            } else {
                content
                    .tint(tint)
                    .listRowInsets(EdgeInsets())
            }
        } else {
            if colorScheme == .light {
                content
                    .listRowInsets(EdgeInsets())
                    .tipBackground(.white)
            } else {
                content
                    .listRowInsets(EdgeInsets())
            }
        }
    }
}

extension View {
    func tipStyle(tint: Color?, background: Color? = nil, asSection: Bool = false) -> some View {
        modifier(TipStyleModifier(tint: tint, background: background, asSection: asSection))
    }
}
