/*
 * Copyright (c) Facebook, Inc. and its 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
import UIKit

final class SelfSizingSectionController: ListSectionController {

    private var model: SelectionModel!

    override init() {
        super.init()
        inset = UIEdgeInsets(top: 0, left: 0, bottom: 40, right: 0)
        minimumLineSpacing = 4
        minimumInteritemSpacing = 4
    }

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

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

    override func cellForItem(at index: Int) -> UICollectionViewCell {
        let text = model.options[index]
        let cell: UICollectionViewCell
        switch model.type {
        case .none:
            guard let manualCell: ManuallySelfSizingCell = collectionContext?.dequeueReusableCell(
                for: self,
                at: index
            ) else {
                fatalError()
            }
            manualCell.text = text
            cell = manualCell
        case .fullWidth:
            guard let manualCell: FullWidthSelfSizingCell = collectionContext?.dequeueReusableCell(
                for: self,
                at: index
            ) else {
                fatalError()
            }
            manualCell.text = text
            cell = manualCell
        case .nib:
            guard let nibCell = collectionContext?.dequeueReusableCell(withNibName: "NibSelfSizingCell",
                                                                       bundle: nil,
                                                                       for: self,
                                                                       at: index) as? NibSelfSizingCell else {
                                                                        fatalError()
            }
            nibCell.contentLabel.text = text
            cell = nibCell
        }
        return cell
    }

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

}
