import Defaults
import Foundation

final class SearchQuery: ObservableObject {
    enum Date: String, CaseIterable, Identifiable {
        case any, hour, today, week, month, year

        var id: SearchQuery.Date.RawValue {
            rawValue
        }

        var name: String {
            rawValue.capitalized
        }
    }

    enum Duration: String, CaseIterable, Identifiable {
        case any, short, long

        var id: SearchQuery.Duration.RawValue {
            rawValue
        }

        var name: String {
            rawValue.capitalized
        }
    }

    enum SortOrder: String, CaseIterable, Identifiable {
        case relevance, rating, uploadDate, viewCount

        var id: SearchQuery.SortOrder.RawValue {
            rawValue
        }

        var name: String {
            switch self {
            case .uploadDate:
                return "Date"
            case .viewCount:
                return "Views"
            default:
                return rawValue.capitalized
            }
        }

        var parameter: String {
            switch self {
            case .uploadDate:
                return "upload_date"
            case .viewCount:
                return "view_count"
            default:
                return rawValue
            }
        }
    }

    @Published var query: String
    @Published var sortBy: SearchQuery.SortOrder = .relevance
    @Published var date: SearchQuery.Date? = .month
    @Published var duration: SearchQuery.Duration?

    init(query: String = "", sortBy: SearchQuery.SortOrder = .relevance, date: SearchQuery.Date? = nil, duration: SearchQuery.Duration? = nil) {
        self.query = query
        self.sortBy = sortBy
        self.date = date
        self.duration = duration
    }

    var isEmpty: Bool {
        query.isEmpty
    }
}