//
//  UpdateExternalResourceAction.swift
//  ClashX
//
//  Created by yicheng on 2023/9/4.
//  Copyright © 2023 west2online. All rights reserved.
//

import Foundation

enum UpdateExternalResourceAction {
    static func run() {
        ApiRequest.requestExternalProviderNames { provider in
            let group = DispatchGroup()
            var successCount = 0
            let totalCount = provider.proxies.count + provider.rules.count
            if totalCount == 0 {
                onFinished(success: 0, total: 0, fails: [])
                return
            }
            var fails = [String]()
            for name in provider.proxies {
                group.enter()
                ApiRequest.updateProvider(name: name, type: .proxy) { success in
                    if success { successCount += 1 } else {
                        fails.append(name)
                    }
                    group.leave()
                }
            }

            for name in provider.rules {
                group.enter()
                ApiRequest.updateProvider(name: name, type: .rule) { success in
                    if success { successCount += 1 } else {
                        fails.append(name)
                    }
                    group.leave()
                }
            }

            group.notify(queue: .main) {
                onFinished(success: successCount, total: totalCount, fails: fails)
            }
        }
    }

    private static func onFinished(success: Int, total: Int, fails: [String]) {
        var info = String(format: NSLocalizedString("total: %d, success: %d", comment: ""), total, success)
        if !fails.isEmpty {
            info.append(String(format: NSLocalizedString("fails: %@", comment: ""), fails.joined(separator: " ")))
        }
        NSUserNotificationCenter.default.post(title: NSLocalizedString("Update external resource complete", comment: ""), info: info)
    }
}
