/*
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

import IGListKit
import IGListSwiftKit

final class FeedItemSectionController: ListSectionController, ListSupplementaryViewSource {

    private var feedItem: FeedItem!

    override init() {
        super.init()
        supplementaryViewSource = self
    }

    // MARK: IGListSectionController Overrides

    override func numberOfItems() -> Int {
        return feedItem.comments.count
    }

    override func sizeForItem(at index: Int) -> CGSize {
        return CGSize(width: collectionContext!.containerSize.width, height: 55)
    }

    override func cellForItem(at index: Int) -> UICollectionViewCell {
        let cell: LabelCell = collectionContext.dequeueReusableCell(for: self, at: index)
        cell.text = feedItem.comments[index]
        return cell
    }

    override func didUpdate(to object: Any) {
        feedItem = object as? FeedItem
    }

    // MARK: ListSupplementaryViewSource

    func supportedElementKinds() -> [String] {
        return [UICollectionView.elementKindSectionHeader, UICollectionView.elementKindSectionFooter]
    }

    func viewForSupplementaryElement(ofKind elementKind: String, at index: Int) -> UICollectionReusableView {
        switch elementKind {
        case UICollectionView.elementKindSectionHeader:
            return userHeaderView(atIndex: index)
        case UICollectionView.elementKindSectionFooter:
            return userFooterView(atIndex: index)
        default:
            fatalError()
        }
    }

    func sizeForSupplementaryView(ofKind elementKind: String, at index: Int) -> CGSize {
        return CGSize(width: collectionContext!.containerSize.width, height: 40)
    }

    // MARK: Private
    private func userHeaderView(atIndex index: Int) -> UICollectionReusableView {
        let view: UserHeaderView = collectionContext.dequeueReusableSupplementaryView(
            ofKind: UICollectionView.elementKindSectionHeader,
            forSectionController: self,
            nibName: "UserHeaderView",
            bundle: nil,
            atIndex: index)
        view.handle = "@" + feedItem.user.handle
        view.name = feedItem.user.name
        return view
    }

    private func userFooterView(atIndex index: Int) -> UICollectionReusableView {
        let view: UserFooterView = collectionContext.dequeueReusableSupplementaryView(
            ofKind: UICollectionView.elementKindSectionFooter,
            forSectionController: self,
            nibName: "UserFooterView",
            bundle: nil,
            atIndex: index)
        view.commentsCount = "\(feedItem.comments.count)"
        return view
    }
}
