// Copyright 2018-present the Material Components for iOS authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

import Foundation

import MaterialComponents.MaterialList
import MaterialComponents.MaterialShadowElevations

class BaseCellExample : UIViewController {
  private let arbitraryCellHeight: CGFloat = 75
  fileprivate let baseCellIdentifier: String = "baseCellIdentifier"
  fileprivate let numberOfCells: Int = 100

  private lazy var collectionView: UICollectionView = {
    return UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())
  }()

  private var collectionViewLayout: UICollectionViewFlowLayout {
    return collectionView.collectionViewLayout as! UICollectionViewFlowLayout
  }

  private var collectionViewEstimatedCellSize: CGSize {
    return CGSize(width: collectionView.bounds.size.width - 20,
                  height: arbitraryCellHeight)
  }

  override func viewDidLoad() {
    super.viewDidLoad()
    parent?.automaticallyAdjustsScrollViewInsets = false
    automaticallyAdjustsScrollViewInsets = false
    setUpCollectionView()
  }

  override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    positionCollectionView()
  }

  func setUpCollectionView() {
    collectionViewLayout.estimatedItemSize = collectionViewEstimatedCellSize
    collectionViewLayout.minimumInteritemSpacing = 5
    collectionViewLayout.minimumLineSpacing = 5
    collectionView.backgroundColor = .white
    collectionView.register(MDCBaseCell.self, forCellWithReuseIdentifier: baseCellIdentifier)
    collectionView.delegate = self
    collectionView.dataSource = self
    view.addSubview(collectionView)
  }

  func positionCollectionView() {
    var originX = view.bounds.origin.x
    var originY = view.bounds.origin.y
    var width = view.bounds.size.width
    var height = view.bounds.size.height

    #if swift(>=3.2)
    if #available(iOS 11.0, *) {
      originX += view.safeAreaInsets.left
      originY += view.safeAreaInsets.top
      width -= (view.safeAreaInsets.left + view.safeAreaInsets.right)
      height -= (view.safeAreaInsets.top + view.safeAreaInsets.bottom)
    }
    #endif

    let frame = CGRect(x: originX, y: originY, width: width, height: height);
    collectionView.frame = frame
    collectionViewLayout.estimatedItemSize = collectionViewEstimatedCellSize
    collectionViewLayout.invalidateLayout()
    collectionView.reloadData()
  }
}

extension BaseCellExample: UICollectionViewDelegate {
  func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath) {
    guard let cell = collectionView.cellForItem(at: indexPath) as? MDCBaseCell else { fatalError() }
    cell.elevation = ShadowElevation(rawValue: 10)
  }

  func collectionView(_ collectionView: UICollectionView,
                      didUnhighlightItemAt indexPath: IndexPath) {
    guard let cell = collectionView.cellForItem(at: indexPath) as? MDCBaseCell else { fatalError() }
    cell.elevation = ShadowElevation(rawValue: 0)
  }
}

extension BaseCellExample: UICollectionViewDataSource {
  func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
  }

  func collectionView(_ collectionView: UICollectionView,
                      numberOfItemsInSection section: Int) -> Int {
    return numberOfCells
  }

  func collectionView(_ collectionView: UICollectionView,
                      cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: baseCellIdentifier,
                                                        for: indexPath) as? MDCBaseCell
      else { fatalError() }
    cell.layer.borderColor = UIColor.darkGray.cgColor
    cell.layer.borderWidth = 1
    cell.inkColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.1)
    return cell
  }
}

// MARK: Catalog By Convention
extension BaseCellExample {

  class func catalogMetadata() -> [String: Any] {
    return [
      "breadcrumbs": ["List Items", "MDCBaseCell Example (Swift)"],
      "description": "MDCBaseCell Example (Swift)",
      "primaryDemo": true,
      "presentable": true,
    ]
  }
}
