import ComposableArchitecture
import Localization

public enum MultiButtonAlertStyleV2: Equatable {
    public struct TextCopy: Equatable, Codable {
        static let empty: TextCopy = .init(
            title: "",
            description: "",
            primaryButtonLabel: "",
            secondaryButtonLabel: ""
        )

        let title: String
        let description: String
        let primaryButtonLabel: String
        let secondaryButtonLabel: String

        public init(title: String, description: String, primaryButtonLabel: String, secondaryButtonLabel: String) {
            self.title = title
            self.description = description
            self.primaryButtonLabel = primaryButtonLabel
            self.secondaryButtonLabel = secondaryButtonLabel
        }
    }

    public static func == (lhs: MultiButtonAlertStyleV2, rhs: MultiButtonAlertStyleV2) -> Bool {
        return lhs.textCopy == rhs.textCopy
    }

    case preset(MultiButtonAlertStyleV2.Preset)
    case custom(MultiButtonAlertStyleV2.TextCopy)

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

public enum MultiButtonAlertStyleUnified: Equatable {
    case v1(MultiButtonAlertStyle)
    case v2(MultiButtonAlertStyleV2)

    public var textCopy: (title: String, description: String, primaryButtonLabel: String, secondaryButtonLabel: String) {
        switch self {
        case .v1(let style):
            let copy = style.textCopy
            return (copy.title, copy.description, copy.primaryButtonLabel, copy.secondaryButtonLabel)

        case .v2(let style):
            let copy = style.textCopy
            return (copy.title, copy.description, copy.primaryButtonLabel, copy.secondaryButtonLabel)
        }
    }
}

public extension MultiButtonAlertStyleUnified {
    func toString() -> String {
        let copy = self.textCopy
        return "\(copy.title)|\(copy.description)|\(copy.primaryButtonLabel)|\(copy.secondaryButtonLabel)"
    }
}

public enum MultiButtonAlertStyle: Equatable {
    public struct TextCopy: Equatable, Codable {
        static let empty: TextCopy = .init(
            title: "",
            description: "",
            primaryButtonLabel: "",
            secondaryButtonLabel: ""
        )

        let title: String
        let description: String
        let primaryButtonLabel: String
        let secondaryButtonLabel: String

        public init(title: String, description: String, primaryButtonLabel: String, secondaryButtonLabel: String) {
            self.title = title
            self.description = description
            self.primaryButtonLabel = primaryButtonLabel
            self.secondaryButtonLabel = secondaryButtonLabel
        }
    }

    public static func == (lhs: MultiButtonAlertStyle, rhs: MultiButtonAlertStyle) -> Bool {
        return lhs.textCopy == rhs.textCopy
    }

    case preset(MultiButtonAlertStyle.Preset)
    case custom(MultiButtonAlertStyle.TextCopy)

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