//
//  ResiliationCheckStep.swift
//  Sequoia
//
//  Created by Victor on 11/10/2024.
//

import Foundation

enum ResiliationType: String {
    case apPart = "ap_part"
    case apPartWithBooster = "ap_part_with_booster"
    case boosterPart = "booster_part"
    case apProWithTrial = "ap_pro_with_trial"
    case apProWithTrialWithBooster = "ap_pro_with_trial_with_booster"
    case apProWithoutTrial = "ap_pro_without_trial"
    case apProWithoutTrialWithBooster = "ap_pro_without_trial_with_booster"
    case boosterPro = "booster_pro"
}

enum ResiliationPromotionalScreen: String {
    case externalReview = "external_review"
    case webinarPresentation = "webinar_presentation"
    case profileCompletion = "profile_completion"
    case editPerimeter = "edit_perimeter"
    case onlyProSearches = "only_pro_searches"
    case oneMonthBoosterOffered = "one_month_booster_offered"
    case allovoisinsPromotion = "allovoisins_promotion"
    case extendMyTrialPeriod = "extend_my_trial_period"
    case askPartProStatusChangeWithCancellation = "ask_part_pro_status_change_with_cancellation"
    case customerSupportForPro = "customer_support_for_pro"
    case customerSupportForPart = "customer_support_for_part"
    case askPartProStatusChange = "ask_part_pro_status_change"
    case ordersPresentation = "orders_presentation"
}

enum ResiliationCheckStep: Identifiable, CaseIterable {
    case responses
    case seo
    case seoPro
    case pictures
    case picturesPro
    case software
    case marketing
    case beFirst
    case boosterBadge
    case boosterSeo

    var id: Self { self }

    var image: String {
        switch self {
        case .responses: return "img_message"
        case .seo: return "img_google"
        case .seoPro: return "img_google"
        case .pictures: return "img_photos"
        case .picturesPro: return "img_photos"
        case .software: return "img_software"
        case .marketing: return "img_flyer"
        case .beFirst: return "img_booster_be_first"
        case .boosterBadge: return "img_booster_badge"
        case .boosterSeo: return "img_booster_seo"
        }
    }

    var text: String {
        switch self {
        case .responses: return "1. Répondre aux demandes d'intervention correspondant à votre activité."
        case .seo: return "2. Utiliser le logiciel d'activité. L'ensemble de vos données et documents (devis, factures...) seront supprimées."
        case .seoPro: return "3. Bénéficier du référencement prioritaire de votre profil sur les moteurs de recherche (Google ...)*"
        case .pictures: return "3. Afficher plus de 3 photos de réalisations sur votre page profil. Seules les 3 photos les plus anciennes seront conservées."
        case .picturesPro: return "5. Afficher plus de 3 photos de réalisations sur votre page profil. Seules les 3 photos les plus anciennes seront conservées."
        case .software: return "4. Accéder à vos outils marketing (prospectus, carte de visite)"
        case .marketing: return "5. Afficher plus de 3 photos de réalisations sur votre page profil. Seules les 3 photos les plus anciennes seront conservées."
        case .beFirst: return "1. L'affichage de votre profile en tête de liste des résultats"
        case .boosterBadge: return "2. Être démarqué visuellement par le Badge « Profil boosté » à chaque affichage de votre profil."
        case .boosterSeo: return "3. Être référencé prioritairement sur les moteurs de recherche."
        }
    }

    var subtitle: String {
        switch self {
        case .seo: return "*Cette action est irréversible et vous perdrez tout l’historique du référencement de votre page profil. En cas de réabonnement, récupérer un référencement de qualité pourra prendre plusieurs mois."
        case .seoPro: return "*Cette action est irréversible et vous perdrez tout l’historique du référencement de votre page profil. En cas de réabonnement, récupérer un référencement de qualité pourra prendre plusieurs mois."
        default: return ""
        }
    }

    /**
     Récupère une liste d'étapes de vérification en fonction du type de résiliation spécifié.

     Cette fonction renvoie une liste d'étapes de vérification adaptée au type de résiliation fourni.
     Les étapes sont sélectionnées à partir d'un ensemble prédéfini pour chaque type de résiliation.

     - Parameter resiliationType: Le type de résiliation pour lequel récupérer les étapes de vérification.
                                  Peut être l'un des types suivants :
                                  - `.apPart` ou `.apPartWithBooster` pour les particuliers
                                  - `.boosterPart` ou `.boosterPro` pour les options Booster
                                  - `.apProWithTrial`, `.apProWithoutTrial`, `.apProWithTrialWithBooster`,
                                    ou `.apProWithoutTrialWithBooster` pour les professionnels

     - Returns: Un tableau de `ResiliationCheckStep` contenant les étapes de vérification appropriées
                pour le type de résiliation spécifié.

     - Note: Les étapes disponibles varient selon le type de résiliation :
             - Pour les particuliers : réponses, SEO, photos
             - Pour les options Booster : être premier, badge Booster, SEO Booster
             - Pour les professionnels : réponses, logiciel, SEO pro, marketing, photos pro

     - Important: Contrairement à la fonction de raisons de résiliation, les étapes renvoyées
                  ne sont pas mélangées et sont retournées dans l'ordre défini.
    */
    static func getCheckSteps(for resiliationType: ResiliationType) -> [ResiliationCheckStep] {
        var availableSteps: [ResiliationCheckStep]
        switch resiliationType {
        case .apPart,
             .apPartWithBooster:
            availableSteps = [
                .responses,
                .seo,
                .pictures
            ]
        case .boosterPart,
             .boosterPro:
            availableSteps = [
                .beFirst,
                .boosterBadge,
                .boosterSeo
            ]
        case .apProWithTrial,
             .apProWithoutTrial,
             .apProWithTrialWithBooster,
             .apProWithoutTrialWithBooster:
            availableSteps = [
                .responses,
                .software,
                .seoPro,
                .marketing,
                .picturesPro
            ]
        }
        return availableSteps
    }
}

enum ResiliationReason: Identifiable, CaseIterable {
    case lowDemand
    case noPositiveResponses
    case noBoostNeeded
    case singleSubscription
    case pauseBoost
    case lowImpact
    case lowIncome
    case lowRevenue
    case betterPlatforms
    case activityStop
    case newJob
    case insufficientTime
    case notPro
    case fullSchedule
    case temporaryPause
    case activityPause
    case uninterestingRequests
    case misunderstoodPremier
    case other

    var id: Self { self }

    var text: String {
        switch self {
        case .lowDemand:
            return "Je ne reçois pas assez de demandes"
        case .noPositiveResponses:
            return "Je reçois des demandes mais je n'ai pas assez de réponses positives à mes propositions"
        case .noBoostNeeded:
            return "Cela m'a apporté beaucoup, je n'ai plus besoin que mon profil soit boosté"
        case .singleSubscription:
            return "Je paye déjà un abonnement Premier, je préfère ne conserver qu'un seul abonnement"
        case .pauseBoost:
            return "Je stoppe momentanément, je réactiverai l'option Booster plus tard"
        case .lowImpact:
            return "Je n'ai pas eu assez de retombées"
        case .lowIncome:
            return "Cela ne me rapporte pas assez d'argent"
        case .lowRevenue:
            return "Cela ne me rapporte pas assez de chiffre d’affaires : trop de “petites” interventions"
        case .betterPlatforms:
            return "Je suis sur d'autres plateformes plus intéressantes"
        case .activityStop:
            return "J'arrête mon activité définitivement"
        case .newJob:
            return "J'ai trouvé un nouveau travail"
        case .insufficientTime:
            return "Je n'ai pas eu suffisamment de temps pour me faire une opinion"
        case .notPro:
            return "Je ne suis pas un professionnel, c'est une erreur"
        case .fullSchedule:
            return "Actuellement mon agenda est rempli"
        case .temporaryPause:
            return "Je m'absente ou je mets en pause, je reviendrai après"
        case .activityPause:
            return "Je mets en pause mon activité"
        case .uninterestingRequests:
            return "J'ai des demandes, mais elles ne m'intéressent pas"
        case .misunderstoodPremier:
            return "Je n'ai pas compris le fonctionnement de l'abonnement Premier"
        case .other:
            return "Autre"
        }
    }

    /**
      Récupère une liste de raisons de résiliation en fonction du type de résiliation spécifié.

      Cette fonction renvoie une liste de raisons de résiliation adaptée au type de résiliation fourni.
      Les raisons sont sélectionnées à partir d'un ensemble prédéfini pour chaque type de résiliation,
      puis mélangées aléatoirement. La raison "Autre" est toujours ajoutée à la fin de la liste.

      - Parameter resiliationType: Le type de résiliation pour lequel récupérer les raisons.
                                   Peut être l'un des types suivants :
                                   - `.apPart` ou `.apPartWithBooster` pour les particuliers
                                   - `.apProWithTrial` ou `.apProWithTrialWithBooster` pour les pros en période d'essai
                                   - `.apProWithoutTrial` ou `.apProWithoutTrialWithBooster` pour les pros hors période d'essai
                                   - `.boosterPart` ou `.boosterPro` pour les options Booster

      - Returns: Un tableau de `ResiliationReason` contenant les raisons de résiliation appropriées,
                 mélangées aléatoirement, avec la raison "Autre" ajoutée à la fin.

      - Note: Les raisons disponibles varient selon le type de résiliation :
              - Pour les particuliers : pause temporaire, nouveau travail, revenus insuffisants, etc.
              - Pour les pros en période d'essai : non professionnel, pas de réponses positives, demandes insuffisantes, etc.
              - Pour les pros hors période d'essai : demandes insuffisantes, agenda rempli, arrêt d'activité, etc.
              - Pour les options Booster : abonnement unique, pause du boost, impact insuffisant, etc.

      - Important: La liste renvoyée est toujours mélangée aléatoirement pour varier l'ordre de présentation,
                   à l'exception de la raison "Autre" qui est toujours placée en dernière position.
     */
    static func getRadioResiliation(for resiliationType: ResiliationType) -> [ResiliationReason] {
        let availableReasons: [ResiliationReason]

        switch resiliationType {
        // Particulier & Particulier avec Booster
        case .apPart,
             .apPartWithBooster:
            availableReasons = [
                .temporaryPause,
                .newJob,
                .lowIncome,
                .noPositiveResponses,
                .lowDemand,
                .betterPlatforms
            ]
        // Pro avec période d'essai & Pro avec période d'essai et Booster
        case .apProWithTrial,
             .apProWithTrialWithBooster:
            availableReasons = [
                .notPro,
                .noPositiveResponses,
                .lowDemand,
                .insufficientTime,
                .uninterestingRequests,
                .misunderstoodPremier,
                .betterPlatforms
            ]
        // Pro sans période d'essai et Booster & Pro sans période d'essai
        case .apProWithoutTrial,
             .apProWithoutTrialWithBooster:
            availableReasons = [
                .lowDemand,
                .fullSchedule,
                .noPositiveResponses,
                .activityStop,
                .lowRevenue,
                .betterPlatforms
            ]
        // Booster particulier & Pro
        case .boosterPart,
             .boosterPro:
            availableReasons = [
                .singleSubscription,
                .pauseBoost,
                .lowImpact,
                .noBoostNeeded
            ]
        }

        var reasons = availableReasons.shuffled()
        reasons.append(.other)

        return reasons
    }
}
