import Foundation
import UIKit
import Postbox
import SwiftSignalKit
import TelegramUIPreferences

private struct SettingsSearchRecentQueryItemId {
    public let rawValue: MemoryBuffer
    
    var value: Int64 {
        return self.rawValue.makeData().withUnsafeBytes { $0.pointee } as Int64
    }
    
    init(_ rawValue: MemoryBuffer) {
        self.rawValue = rawValue
    }
    
    init(_ value: Int64) {
        var value = value
        self.rawValue = MemoryBuffer(data: Data(bytes: &value, count: MemoryLayout.size(ofValue: value)))
    }
}

public final class RecentSettingsSearchQueryItem: OrderedItemListEntryContents {
    public init() {
    }
    
    public init(decoder: PostboxDecoder) {
    }
    
    public func encode(_ encoder: PostboxEncoder) {
    }
}

func addRecentSettingsSearchItem(postbox: Postbox, item: SettingsSearchableItemId) {
    let _ = (postbox.transaction { transaction in
        let itemId = SettingsSearchRecentQueryItemId(item.index)
        transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: ApplicationSpecificOrderedItemListCollectionId.settingsSearchRecentItems, item: OrderedItemListEntry(id: itemId.rawValue, contents: RecentSettingsSearchQueryItem()), removeTailIfCountExceeds: 100)
    }).start()
}

func removeRecentSettingsSearchItem(postbox: Postbox, item: SettingsSearchableItemId) {
    let _ = (postbox.transaction { transaction -> Void in
        let itemId = SettingsSearchRecentQueryItemId(item.index)
        transaction.removeOrderedItemListItem(collectionId: ApplicationSpecificOrderedItemListCollectionId.settingsSearchRecentItems, itemId: itemId.rawValue)
    }).start()
}

func clearRecentSettingsSearchItems(postbox: Postbox) {
    let _ = (postbox.transaction { transaction -> Void in
        transaction.replaceOrderedItemListItems(collectionId: ApplicationSpecificOrderedItemListCollectionId.settingsSearchRecentItems, items: [])
    }).start()
}

func settingsSearchRecentItems(postbox: Postbox) -> Signal<[SettingsSearchableItemId], NoError> {
    return postbox.combinedView(keys: [.orderedItemList(id: ApplicationSpecificOrderedItemListCollectionId.settingsSearchRecentItems)])
    |> mapToSignal { view -> Signal<[SettingsSearchableItemId], NoError> in
        return postbox.transaction { transaction -> [SettingsSearchableItemId] in
            var result: [SettingsSearchableItemId] = []
            if let view = view.views[.orderedItemList(id: ApplicationSpecificOrderedItemListCollectionId.settingsSearchRecentItems)] as? OrderedItemListView {
                for item in view.items {
                    let index = SettingsSearchRecentQueryItemId(item.id).value
                    if let itemId = SettingsSearchableItemId(index: index) {
                        result.append(itemId)
                    }
                }
            }
            return result
        }
    }
}