/**
 * Copyright (c) 2016-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

#import <UIKit/UIKit.h>

#import <IGListKit/IGListMacros.h>

@class IGListAdapter;
@class IGListSectionController;



NS_ASSUME_NONNULL_BEGIN

IGLK_SUBCLASSING_RESTRICTED
@interface IGListDisplayHandler : NSObject

/**
 Counted set of the currently visible section controllers.
 */
@property (nonatomic, strong, readonly) NSCountedSet<IGListSectionController *> *visibleListSections;

/**
 Tells the handler that a cell will be displayed in the IGListAdapter.

 @param cell A cell that will be displayed.
 @param listAdapter The adapter the cell will display in.
 @param sectionController The section controller that manages the cell.
 @param object The object that powers the section controller.
 @param indexPath The index path of the cell in the UICollectionView.
 */
- (void)willDisplayCell:(UICollectionViewCell *)cell
         forListAdapter:(IGListAdapter *)listAdapter
      sectionController:(IGListSectionController *)sectionController
                 object:(id)object
              indexPath:(NSIndexPath *)indexPath;

/**
 Tells the handler that a cell did end display in the IGListAdapter.

 @param cell A cell that will be displayed.
 @param listAdapter The adapter the cell will display in.
 @param sectionController The section controller that manages the cell.
 @param indexPath The index path of the cell in the UICollectionView.
 */
- (void)didEndDisplayingCell:(UICollectionViewCell *)cell
              forListAdapter:(IGListAdapter *)listAdapter
           sectionController:(IGListSectionController *)sectionController
                   indexPath:(NSIndexPath *)indexPath;


/**
 Tells the handler that a supplementary view will be displayed in the IGListAdapter.

 @param view A supplementary view that will be displayed.
 @param listAdapter The adapter the supplementary view will display in.
 @param sectionController The section controller that manages the supplementary view.
 @param object The object that powers the section controller.
 @param indexPath The index path of the supplementary view in the UICollectionView.
 */
- (void)willDisplaySupplementaryView:(UICollectionReusableView *)view
                      forListAdapter:(IGListAdapter *)listAdapter
                   sectionController:(IGListSectionController *)sectionController
                              object:(id)object
                           indexPath:(NSIndexPath *)indexPath;


/**
 Tells the handler that a supplementary view did end display in the IGListAdapter.

 @param view A supplementary view that will be displayed.
 @param listAdapter The adapter the supplementary view will display in.
 @param sectionController The section controller that manages the supplementary view.
 @param indexPath The index path of the supplementary view in the UICollectionView.
 */
- (void)didEndDisplayingSupplementaryView:(UICollectionReusableView *)view
                           forListAdapter:(IGListAdapter *)listAdapter
                        sectionController:(IGListSectionController *)sectionController
                                indexPath:(NSIndexPath *)indexPath;

@end

NS_ASSUME_NONNULL_END
