SubscriptionViewController.swift 3.4 KB
//
//  SubscriptionViewController.swift
//  browser
//
//  Created by Artem Talko on 24.11.2023.
//

import UIKit
import StoreKit


final class SubscriptionViewController: UIViewController {
    
    private let mainView = SubscriptionView()
    
    private let tableViewData: [String]
    private let storeKitManager: SubscriptionManager
    private let successCompletion: () -> Void
    
    init(storeKit: SubscriptionManager, complition: @escaping() -> Void) {
        tableViewData = StringConstants.removeAdvertTableViewData
        storeKitManager = storeKit
        successCompletion = complition
        
        super.init(nibName: nil, bundle: nil)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        initViewController()
    }
    
    override func loadView() {
        view = mainView
    }
   
    private func initViewController() {
        addTargets()
        setupTableView()
    }
}

//MARK: - Table View
extension SubscriptionViewController: UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return tableViewData.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: SubscriptionTableViewCell.cellID) as?
                SubscriptionTableViewCell else {
            return UITableViewCell()
        }
        cell.advantagesCellLabel.text = tableViewData[indexPath.row]
        
        return cell
    }
}

//MARK: Helpers
extension SubscriptionViewController {
    private func addTargets() {
        mainView.closeButton.addTarget(self, action: #selector(closeViewController(_ :)), for: .touchUpInside)
        mainView.subscribeButton.addTarget(self, action: #selector(buyAdblocker), for: .touchUpInside)
    }
    
    private func setupTableView() {
        mainView.advantagesTableView.dataSource = self
        mainView.advantagesTableView.delegate = self
        mainView.advantagesTableView.register(SubscriptionTableViewCell.self, forCellReuseIdentifier: SubscriptionTableViewCell.cellID)
    }
    
    @MainActor
    private func buySubscription() async throws {
        if let adblockerProduct = storeKitManager.storeProducts.first(where: { $0.id == SubscriptionsModel.subscriptionInfo["adBlocker"]}) {
            if let transaction = try await storeKitManager.purchase(adblockerProduct) {
                CachingManager.shared.expirationDate = transaction.expirationDate?.timeIntervalSince1970 ?? 0
                dismiss(animated: true)
                successCompletion()
            }
        }
    }
}


//MARK: Action
extension SubscriptionViewController {
    @objc
    private func closeViewController(_ sender: UIButton) {
        dismiss(animated: true, completion: nil)
    }
    
    @objc
    private func buyAdblocker(_ sender: UIButton) {
        Task {
            do {
               try await buySubscription()
            } catch {
                let alert = UIAlertController(title: "Fail!", message: "Error with subscription", preferredStyle: .alert)
                let okAction = UIAlertAction(title: "OK", style: .default)
                alert.addAction(okAction)
                present(alert, animated: true)
            }
        }
    }
}