// Copyright 2019-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 UIKit
import MaterialComponents.MaterialTabs_TabBarView 
import MaterialComponents.MaterialContainerScheme

class TabBarViewExample: UIViewController {

  static let title = "TabBarView (Swift)"

  @objc var containerScheme: MDCContainerScheming = MDCContainerScheme()

  lazy var tabBar: MDCTabBarView = {
    let tabBar = MDCTabBarView()
    tabBar.items = self.tabBarItems
    tabBar.tabBarDelegate = self
    tabBar.translatesAutoresizingMaskIntoConstraints = false
    return tabBar
  }()

  let itemIcons = [
    UIImage(named: "system_icons/home")?.withRenderingMode(.alwaysTemplate),
    UIImage(named: "system_icons/favorite")?.withRenderingMode(.alwaysTemplate),
    UIImage(named: "system_icons/cake")?.withRenderingMode(.alwaysTemplate),
    UIImage(named: "system_icons/email")?.withRenderingMode(.alwaysTemplate),
    UIImage(named: "system_icons/search")?.withRenderingMode(.alwaysTemplate),
  ]

  let itemTitles = ["Home", "Unselectable", "Cake", "Email", "Search"]

  lazy var tabBarItems: [UITabBarItem] = {
    return zip(itemTitles, itemIcons)
      .enumerated()
      .map { (index, titleIconPair) in
        let (title, icon) = titleIconPair
        return UITabBarItem(title: title, image: icon, tag: index)
      }
  }()

  override func viewDidLoad() {
    super.viewDidLoad()
    title = TabBarViewExample.title

    applyFixForInjectedAppBar()

    view.backgroundColor = containerScheme.colorScheme.backgroundColor
    view.addSubview(tabBar)
    view.layoutMarginsGuide.topAnchor.constraint(equalTo: tabBar.topAnchor).isActive = true
    view.leadingAnchor.constraint(equalTo: tabBar.leadingAnchor).isActive = true
    view.trailingAnchor.constraint(equalTo: tabBar.trailingAnchor).isActive = true

    applyThemingToTabBarView()
  }

  // MARK: Private

  private func applyThemingToTabBarView() {
    tabBar.barTintColor = containerScheme.colorScheme.surfaceColor
    tabBar.setTitleColor(
      containerScheme.colorScheme.onSurfaceColor.withAlphaComponent(0.6),
      for: .normal)
    tabBar.setTitleColor(containerScheme.colorScheme.primaryColor, for: .selected)
    tabBar.setImageTintColor(containerScheme.colorScheme.onSurfaceColor, for: .normal)
    tabBar.setImageTintColor(containerScheme.colorScheme.primaryColor, for: .selected)
    tabBar.setTitleFont(containerScheme.typographyScheme.button, for: .normal)
    tabBar.setTitleFont(.systemFont(ofSize: 16), for: .selected)
    tabBar.selectionIndicatorStrokeColor = containerScheme.colorScheme.primaryColor
    tabBar.rippleColor = containerScheme.colorScheme.primaryColor.withAlphaComponent(0.1)
    tabBar.bottomDividerColor = containerScheme.colorScheme.onSurfaceColor.withAlphaComponent(0.12)
  }

  private func applyFixForInjectedAppBar() {
    // The injected AppBar has a bug where it will attempt to manipulate the Tab bar. To prevent
    // that bug, we need to inject a scroll view into the view hierarchy before the tab bar. The App
    // Bar will manipulate with that one instead.
    let bugFixScrollView = UIScrollView()
    bugFixScrollView.isUserInteractionEnabled = false
    bugFixScrollView.isHidden = true
    view.addSubview(bugFixScrollView)
  }
}

extension TabBarViewExample: MDCTabBarViewDelegate {
  func tabBarView(_ tabBarView: MDCTabBarView, shouldSelect item: UITabBarItem) -> Bool {
    return tabBar.items.index(of: item) != 1
  }

  func tabBarView(_ tabBarView: MDCTabBarView, didSelect item: UITabBarItem) {
    print("Item \(item.title!) was selected.")
  }
}

extension TabBarViewExample {
  @objc class func catalogMetadata() -> [String: Any] {
    return [
      "breadcrumbs": ["Tab Bar", TabBarViewExample.title],
      "primaryDemo": false,
      "presentable": false,
    ]
  }
}
