import Foundation

public enum ShareableTarget: Hashable {
    case system(System)
    case platform(Platform)

    public enum System: String, Codable, CaseIterable, Hashable, RawRepresentable {
        case copyLink
        case download
        case more
    }

    public enum Platform: String, Codable, CaseIterable, Hashable, RawRepresentable {
        case instagram
        case tiktok
        case messages
        case x
        case whatsApp
        case facebook
    }
}

extension ShareableTarget: RawRepresentable {
    public var rawValue: String {
        switch self {
        case .system(let action):
            return action.rawValue

        case .platform(let platform):
            return platform.rawValue
        }
    }

    public init?(rawValue: String) {
        if let system = System(rawValue: rawValue) {
            self = .system(system)
        }
        if let platform = Platform(rawValue: rawValue) {
            self = .platform(platform)
        }
        return nil
    }

    var platform: Platform? {
        switch self {
        case .system:
            return nil

        case .platform(let platform):
            return platform
        }
    }
}

extension ShareableTarget: CaseIterable {
    // This is the default order for a user who hasn't used the feature yet.
    public static var defaultOrder: [ShareableTarget] = [
        .system(.copyLink),
        .system(.download),
        .platform(.instagram),
        .platform(.tiktok),
        .platform(.messages),
        .platform(.x),
        .platform(.whatsApp),
        .platform(.facebook),
        .system(.more),
    ]

    public static var allCases: Set<ShareableTarget> {
        Set(defaultOrder)
    }
}
