import ComponentLibrary
import Localization

public extension VersioningAlertStyle {
    enum Preset: Equatable {
        case v4PaidUserAnnounce
        case v4PaidUserAnnounceV2

        case v4FreeUserAnnounce
        case v4FreeUserAnnounceV2
        case v4FreeUserUpgradeInfoPush
        case v4FreeUserCountRemainingContinue(_ count: Int)
        case v4FreeUserHitYourLimit

        case v4InformationWithCreateRedirect
        case v4InformationWithCreateRedirectV2
        case v4InformationWithDismiss
        case v4InformationWithDismissV2
        case v4UpgradeToV4

        case v4RemasterAnnounce

        case v4_5FreeUserUpgradeInfoPush

        var auraColor: VersioningV4Background.ViewStyle {
            switch self {
            case .v4PaidUserAnnounce,
                 .v4PaidUserAnnounceV2,
                 .v4FreeUserAnnounce,
                 .v4FreeUserAnnounceV2,
                 .v4FreeUserUpgradeInfoPush,
                 .v4FreeUserCountRemainingContinue,
                 .v4FreeUserHitYourLimit,
                 .v4InformationWithCreateRedirect,
                 .v4InformationWithCreateRedirectV2,
                 .v4InformationWithDismiss,
                 .v4InformationWithDismissV2,
                 .v4UpgradeToV4:
                return .v4BlueStandard
            case .v4RemasterAnnounce:
                return .v4PurpleStandard
            case .v4_5FreeUserUpgradeInfoPush:
                return .v4_5Orange
            }
        }

        var textCopy: VersioningAlertStyle.TextCopy {
            var createWithV4Copy: String {
                return "\(L10n.FeatureBrandedAlert.createWith) v4"
            }

            let advancedModelSummaryCopy = L10n.FeatureBrandedAlert.v4CrisperAudioNewAdvanceModel
            let elevateYourSoundSummary = L10n.FeatureBrandedAlert.v4ElevateYourSoundCreativeSongStructures

            switch self {
            case .v4PaidUserAnnounce:
                return .init(
                    mainSummaryCopy: L10n.FeatureBrandedAlert.v4UpdatesCopy2,
                    buttonCopy: createWithV4Copy
                )

            case .v4PaidUserAnnounceV2:
                return .init(
                    mainSummaryCopy: advancedModelSummaryCopy,
                    buttonCopy: createWithV4Copy
                )

            case .v4FreeUserHitYourLimit:
                return .init(
                    mainSummaryCopy: L10n.FeatureBrandedAlert.v4UpgradeToUnlockPushV1,
                    buttonCopy: L10n.FeatureBrandedAlert.v4UpgradeToday
                )

            case .v4FreeUserAnnounce:
                return .init(
                    mainSummaryCopy: L10n.FeatureBrandedAlert.v4UpdatesCopy1,
                    buttonCopy: L10n.FeatureBrandedAlert.upgradeToV4,
                    middleTitle: L10n.FeatureBrandedAlert.whatsNewEmphasize
                )

            case .v4FreeUserAnnounceV2:
                return .init(
                    mainSummaryCopy: elevateYourSoundSummary,
                    buttonCopy: L10n.FeatureBrandedAlert.v4TryFree
                )

            case .v4FreeUserUpgradeInfoPush:
                return .init(
                    mainSummaryCopy: L10n.FeatureBrandedAlert.v4CrisperAudioAccessMore,
                    buttonCopy: L10n.FeatureBrandedAlert.v4UpgradeNow
                )

            case .v4FreeUserCountRemainingContinue(let v4CountLeft):
                return .init(
                    mainSummaryCopy: "",
                    buttonCopy: L10n.FeatureBrandedAlert.v4Continue,
                    countLeft: v4CountLeft
                )

            case .v4InformationWithCreateRedirect,
                 .v4InformationWithDismiss:

                return .init(
                    mainSummaryCopy: L10n.FeatureBrandedAlert.v4UpdatesCopy1,
                    buttonCopy: self == .v4InformationWithDismiss ?
                        L10n.FeatureBrandedAlert.gotItEmphasized : createWithV4Copy,
                    middleTitle: L10n.FeatureBrandedAlert.whatsNewEmphasize
                )

            case .v4InformationWithCreateRedirectV2,
                 .v4InformationWithDismissV2:
                return .init(
                    mainSummaryCopy: advancedModelSummaryCopy,
                    buttonCopy: self == .v4InformationWithDismissV2 ?
                        L10n.FeatureBrandedAlert.gotItEmphasized : createWithV4Copy
                )

            case .v4UpgradeToV4:
                return .init(
                    mainSummaryCopy: L10n.FeatureBrandedAlert.v4UpdatesCopy1,
                    buttonCopy: L10n.FeatureBrandedAlert.upgradeToV4,
                    middleTitle: L10n.FeatureBrandedAlert.whatsNewEmphasize
                )

            case .v4RemasterAnnounce:
                return .init(
                    mainSummaryCopy: L10n.FeatureBrandedAlert.v4RemasterYourFavorite,
                    buttonCopy: L10n.FeatureBrandedAlert.v4TryFree
                )

            case .v4_5FreeUserUpgradeInfoPush:
                return .init(
                    mainSummaryCopy: L10n.FeatureBrandedAlert.v4point5UpgradeSummary,
                    buttonCopy: L10n.FeatureBrandedAlert.v4UpgradeNow
                )
            }
        }

        var tapAction: VersioningAlertStyle.TapAction {
            switch self {
            case .v4FreeUserAnnounce,
                 .v4UpgradeToV4,
                 .v4FreeUserUpgradeInfoPush,
                 .v4FreeUserHitYourLimit:
                return .openSubscriptionPage

            case .v4FreeUserCountRemainingContinue,
                 .v4InformationWithCreateRedirect,
                 .v4InformationWithCreateRedirectV2,
                 .v4PaidUserAnnounce,
                 .v4PaidUserAnnounceV2,
                 .v4FreeUserAnnounceV2:
                return .goToCreate

            case .v4InformationWithDismiss,
                 .v4InformationWithDismissV2:
                return .dismissOnly

            case .v4RemasterAnnounce:
                return .goToLibraryForRemaster

            case .v4_5FreeUserUpgradeInfoPush:
                return .openSubscriptionPage
            }
        }
    }
}
