//
// Copyright 2020 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//

import SignalServiceKit
import SignalUI

// Represents a single item in the conversation history.
// Could be a date header or a unread indicator.
//
// All of the state in this class should be immutable.
public class CVItemModel: NSObject {
    public let interaction: TSInteraction
    public let thread: TSThread
    public let threadAssociatedData: ThreadAssociatedData

    // The item state loaded from the database.
    public let componentState: CVComponentState

    // The item state determined by context, view state.
    public let itemViewState: CVItemViewState

    public var messageCellType: CVMessageCellType { componentState.messageCellType }

    // We can only measure (configure) with a given ConversationStyle.
    // So we need to capture the ConversationStyle at the time the
    // update is initiated. If the ConversationStyle has changed by
    // the time the update is delivered, we should reject the update
    // and request a new one.
    private let coreState: CVCoreState
    public var conversationStyle: ConversationStyle { coreState.conversationStyle }
    public var mediaCache: CVMediaCache { coreState.mediaCache }

    public var itemModel: CVItemModel {
        self
    }

    init(interaction: TSInteraction,
         thread: TSThread,
         threadAssociatedData: ThreadAssociatedData,
         componentState: CVComponentState,
         itemViewState: CVItemViewState,
         coreState: CVCoreState) {

        self.interaction = interaction
        self.thread = thread
        self.threadAssociatedData = threadAssociatedData
        self.componentState = componentState
        self.itemViewState = itemViewState
        self.coreState = coreState
    }
}
