import Foundation

public struct CommentRepliesPage: Codable {
    enum CodingKeys: String, CodingKey {
        case replies
        case replyContinuationToken = "reply_continuation_token"
    }

    public var replies: [ClipComment]
    public let replyContinuationToken: String?

    init(_ remote: Components.Schemas.CommentRepliesPage) throws {
        replies = remote.replies?.compactMap { try? ClipComment($0) } ?? []
        replyContinuationToken = remote.reply_continuation_token
    }

    public mutating func updatePageWithClipAndParentID(_ clipID: String, parentID: String) {
        for index in replies.indices {
            replies[index].parentID = parentID
            replies[index].clipID = clipID
        }
    }
}

public struct CommentSheetRepliesPage: Codable {
    public var replies: [CommentEntity]
    public let replyContinuationToken: String?
    public var totalCount: Int

    init(_ remote: GenAPI.GetCommentRepliesResponse) {
        self.replies = remote.replies?.compactMap { CommentEntity($0) } ?? []
        self.replyContinuationToken = remote.replyContinuationToken
        self.totalCount = remote.totalCount ?? 0
    }

    public mutating func updatePageWithEntityAndParentId(
        for entityType: CommentEntity.CommentEntityType,
        withEntityId entityId: String,
        parentId: String
    ) {
        for index in replies.indices {
            replies[index].parentId = parentId

            switch entityType {
            case .clip:
                replies[index].clipId = entityId
            case .hook:
                replies[index].hookId = entityId
            }
        }
    }
}
