import Combine
import GRDB
import GRDBQuery

/// A player request can be used with the `@Query` property wrapper in order to
/// feed a view with a list of players.
///
/// For example:
///
///     struct MyView: View {
///         @Query(RibbonRequest(ordering: .byName)) private var players: [Ribbon]
///
///         var body: some View {
///             List(players) { player in ... )
///         }
///     }


var idColumn = Column("id")
struct RibbonRequest: Queryable {
    // enum Ordering {
    //     case byScore
    //     case byName
    // }

    /// The ordering used by the player request.
    // var ordering: Ordering
    var id: Int64!

    
    // MARK: - Queryable Implementation
    
    static var defaultValue: [Ribbon] { [] }
    
    func publisher(in appDatabase: AppDatabase) -> AnyPublisher<[Ribbon], Error> {
        // Build the publisher from the general-purpose read-only access
        // granted by `appDatabase.reader`.
        // Some apps will prefer to call a dedicated method of `appDatabase`.
        ValueObservation
            .tracking(fetchValue(_:))
            .publisher(
                in: appDatabase.reader,
                // The `.immediate` scheduling feeds the view right on
                // subscription, and avoids an undesired animation when the
                // application starts.
                scheduling: .immediate)
            .eraseToAnyPublisher()
    }
    
    // This method is not required by Queryable, but it makes it easier
    func fetchValue(_ db: Database) throws -> [Ribbon] {
        if (id == nil) {
            return try Ribbon.fetchAll(db)
        } else {
            return try Ribbon.filter(idColumn == id).fetchAll(db)
        }

        // if book == "" {
        //     return try Ribbon.filter(bookColumn ==  Ribbon.randomBook()).fetchAll(db)
        // } else {
        //     return try Ribbon.filter(bookColumn ==  book).fetchAll(db)
        // }
        // switch ordering {
        // case .byScore:
        //     return try Ribbon.all().fetchAll(db)
        // case .byName:
        //     // return try Ribbon.all().orderedByName().fetchAll(db)
        //     return try Ribbon.all().fetchAll(db)
        // }
    }
}
