import Foundation
import Localization

public enum WalkthroughAlertStyle: Equatable {
    public enum TapAction {
        case exitToLibrary
    }

    public enum ButtonCopy: Equatable, Codable {
        case next
        case previous
        case tryNow
        case learnHow

        public var displayText: String {
            switch self {
            case .next: return L10n.FeatureBrandedAlert.next
            case .previous: return L10n.FeatureBrandedAlert.previous
            case .tryNow: return L10n.FeatureBrandedAlert.tryNow
            case .learnHow: return L10n.FeatureBrandedAlert.learnHow
            }
        }
    }

    public struct TextCopy: Equatable, Codable {
        static let empty: TextCopy = .init(
            titleTagLabel: "",
            pages: []
        )

        let titleTagLabel: String?
        let pages: [Page]

        public init(
            titleTagLabel: String?,
            pages: [Page]
        ) {
            self.titleTagLabel = titleTagLabel
            self.pages = pages
        }
    }

    public struct Page: Equatable, Codable {
        let title: String
        let description: String?
        let assetId: String
        let primaryButton: ButtonCopy
        let secondaryButton: ButtonCopy?

        public init(
            title: String,
            description: String? = nil,
            assetId: String,
            primaryButton: ButtonCopy,
            secondaryButton: ButtonCopy? = nil
        ) {
            self.title = title
            self.description = description
            self.assetId = assetId
            self.primaryButton = primaryButton
            self.secondaryButton = secondaryButton
        }
    }

    case preset(Preset)
    case custom(TextCopy, TapAction)

    public var textCopy: TextCopy {
        switch self {
        case .preset(let preset):
            return preset.textCopy
        case .custom(let textCopy, _):
            return textCopy
        }
    }

    var tapAction: TapAction {
        switch self {
        case .preset(let preset):
            return preset.tapAction
        case .custom(_, let tapAction):
            return tapAction
        }
    }
}
