//
//  CategoryPickerItem.swift
//  Mastodon
//
//  Created by Cirno MainasuK on 2021/3/5.
//

import Foundation
import MastodonSDK

/// Note: update Equatable when change case
enum CategoryPickerItem {
    case all
    case category(category: Mastodon.Entity.Category)
}

extension CategoryPickerItem {
    var title: String {
        switch self {
        case .all:
            return L10n.Scene.ServerPicker.Button.Category.all
        case .category(let category):
            switch category.category {
            case .academia:
                return "📚"
            case .activism:
                return "✊"
            case .food:
                return "🍕"
            case .furry:
                return "🦁"
            case .games:
                return "🕹"
            case .general:
                return "💬"
            case .journalism:
                return "📰"
            case .lgbt:
                return "🏳️‍🌈"
            case .regional:
                return "📍"
            case .art:
                return "🎨"
            case .music:
                return "🎼"
            case .tech:
                return "📱"
            case ._other:
                return "❓"
            }
        }
    }
    
    var accessibilityDescription: String {
        switch self {
        case .all:
            return L10n.Scene.ServerPicker.Button.Category.allAccessiblityDescription
        case .category(let category):
            switch category.category {
            case .academia:
                return L10n.Scene.ServerPicker.Button.Category.academia
            case .activism:
                return L10n.Scene.ServerPicker.Button.Category.activism
            case .food:
                return L10n.Scene.ServerPicker.Button.Category.food
            case .furry:
                return L10n.Scene.ServerPicker.Button.Category.furry
            case .games:
                return L10n.Scene.ServerPicker.Button.Category.games
            case .general:
                return L10n.Scene.ServerPicker.Button.Category.general
            case .journalism:
                return L10n.Scene.ServerPicker.Button.Category.journalism
            case .lgbt:
                return L10n.Scene.ServerPicker.Button.Category.lgbt
            case .regional:
                return L10n.Scene.ServerPicker.Button.Category.regional
            case .art:
                return L10n.Scene.ServerPicker.Button.Category.art
            case .music:
                return L10n.Scene.ServerPicker.Button.Category.music
            case .tech:
                return L10n.Scene.ServerPicker.Button.Category.tech
            case ._other:
                return "❓"  // FIXME:
            }
        }
    }
}

extension CategoryPickerItem: Equatable {
    static func == (lhs: CategoryPickerItem, rhs: CategoryPickerItem) -> Bool {
        switch (lhs, rhs) {
        case (.all, .all):
            return true
        case (.category(let categoryLeft), .category(let categoryRight)):
            return categoryLeft.category.rawValue == categoryRight.category.rawValue
        default:
            return false
        }
    }
}

extension CategoryPickerItem: Hashable {
    func hash(into hasher: inout Hasher) {
        switch self {
        case .all:
            hasher.combine(String(describing: CategoryPickerItem.all.self))
        case .category(let category):
            hasher.combine(category.category.rawValue)
        }
    }
}
