/*
 * 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 UIKit

/// Like ExpandableSectionController, but supports UICollectionViewCompositionalLayout
final class ExpandableComposableSectionController: ListSectionController, CompositionLayoutCapable {

    private var expanded = false
    private var object: String?

    override func sizeForItem(at index: Int) -> CGSize {
        // Size handled by cell
        return CGSize.zero
    }

    override func cellForItem(at index: Int) -> UICollectionViewCell {
        let cell: CompositionLayoutCell = collectionContext.dequeueReusableCell(for: self, at: index)
        cell.text = object
        cell.expanded = expanded
        return cell
    }

    override func didUpdate(to object: Any) {
        self.object = object as? String
    }

    override func didSelectItem(at index: Int) {
        expanded = !expanded

        guard let cell = collectionContext.cellForItem(at: index, sectionController: self) as? CompositionLayoutCell else {
            return
        }
        cell.expanded = expanded

        UIView.animate(withDuration: 0.5,
                       delay: 0,
                       usingSpringWithDamping: 0.4,
                       initialSpringVelocity: 0.6,
                       options: [],
                       animations: {
                        self.collectionContext?.invalidateLayout(for: self)
        })
    }

    // MARK: CompositionLayoutCapable

    func collectionViewSectionLayout(layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection? {
        let config = UICollectionLayoutListConfiguration(appearance: .plain)
        return NSCollectionLayoutSection.list(using: config, layoutEnvironment: layoutEnvironment)
    }

}
