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

final class SwipeActionComposabelSectionController: ListSectionController, CompositionLayoutCapable {

    private var object: SwipeActionSection?

    private var items = ["1. Swipe to delete me", "2. Swipe to delete me", "3. Swipe to delete me"]

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

    override func sizeForItem(at index: Int) -> CGSize {
        // Compositional layout doesn't request sizes per NSIndexPath
        return CGSize.zero
    }

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

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

    func collectionViewSectionLayout(layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection? {
        var config = UICollectionLayoutListConfiguration(appearance: .plain)

        config.trailingSwipeActionsConfigurationProvider = {[weak self] indexPath in
            // Sections should match, but just in case
            guard let self = self, indexPath.section == self.section else {
                return nil
            }
            return self.swipeActionFor(index: indexPath.item)
        }

        return NSCollectionLayoutSection.list(using: config, layoutEnvironment: layoutEnvironment)
    }

    // MARK: CompositionLayoutCapable

    private func swipeActionFor(index: Int) -> UISwipeActionsConfiguration? {
        let action = UIContextualAction(style: .destructive, title: "Delete") {[weak self] _, _, block in
            self?.deleteItem(index: index, block: block)
        }
        return UISwipeActionsConfiguration(actions: [action])
    }

    private func deleteItem(index: Int, block: @escaping (Bool) -> Void) {
        self.collectionContext.performBatch(animated: true) {updates in
            self.items.remove(at: index)
            updates.delete(in: self, at: IndexSet(integer: index))
        } completion: { completed in
            block(completed)
        }
    }

}
