import UIKit
import Shared
import SnapKit

final class SegmentedControl: UIView {
    private let trackHeight = 2.0
    private let numberOfTabs = 2.0
    private let trackView = UIView()
    private let stackView = UIStackView()
    private var leftConstraint: Constraint?
    private let trackIndicatorView = UIView()
    private(set) var leftButton = SegmentedControlButton()
    private(set) var rightButton = SegmentedControlButton()

    init() {
        super.init(frame: .zero)

        rightButton.setup(
            title: Localized.Scan.SegmentedControl.right,
            icon: Asset.scanQr.image
        )

        leftButton.setup(
            title: Localized.Scan.SegmentedControl.left,
            icon: Asset.scanScan.image
        )

        trackView.backgroundColor = Asset.neutralLine.color
        trackIndicatorView.backgroundColor = Asset.brandPrimary.color

        stackView.distribution = .fillEqually
        stackView.addArrangedSubview(leftButton)
        stackView.addArrangedSubview(rightButton)

        addSubview(stackView)
        addSubview(trackView)
        trackView.addSubview(trackIndicatorView)

        stackView.snp.makeConstraints {
            $0.top.equalToSuperview()
            $0.left.equalToSuperview()
            $0.right.equalToSuperview()
            $0.bottom.equalTo(trackView.snp.top)
        }

        trackView.snp.makeConstraints {
            $0.height.equalTo(trackHeight)
            $0.left.equalToSuperview()
            $0.right.equalToSuperview()
            $0.bottom.equalToSuperview()
        }

        trackIndicatorView.snp.makeConstraints {
            $0.top.equalToSuperview()
            leftConstraint = $0.left.equalToSuperview().constraint
            $0.width.equalToSuperview().dividedBy(numberOfTabs)
            $0.bottom.equalToSuperview()
        }
    }

    required init?(coder: NSCoder) { nil }

    func updateLeftConstraint(_ percentageScrolled: CGFloat) {
        let tabWidth = bounds.width / numberOfTabs
        let leftOffset = percentageScrolled * tabWidth
        leftConstraint?.update(offset: leftOffset)

        leftButton.update(color: .fade(
            from: Asset.brandPrimary.color,
            to: Asset.neutralLine.color,
            pcent: percentageScrolled
        ))

        rightButton.update(color: .fade(
            from: Asset.brandPrimary.color,
            to: Asset.neutralLine.color,
            pcent: 1 - percentageScrolled
        ))
    }
}