//
//  AnagogShareService.swift
//
//  Copyright © 2022 Anagog Ltd. All rights reserved.
//

import UIKit
import JedAIKit
import JedAIAppKit

typealias ShareCompletion = UIActivityViewController.CompletionWithItemsHandler

class AnagogShareService {
    
    class func shareFeedback(completion: ShareCompletion? = nil) {
        let controller = UIApplication.shared.keyWindow?.rootViewController
        guard let controller else {
            completion?(nil, false, nil, JedAIAPIError.customError("Unable to present UIActivityController. 'keyWindow' is nil"))
            return
        }
        
        generateFeedback { result in
            switch result {
            case .success(let url):
                DispatchQueue.main.async {
                    shareFile(url, in: controller, completion: completion)
                }
            case .failure(let error):
                completion?(nil, false, nil, error)
            }
        }
    }
    
    class func generateFeedback(completion: @escaping (Result<URL, Error>) -> Void) {
        DispatchQueue.global(qos: .userInitiated).async {
            do {
                let url = try JedAIApp.debug.generateFeedback()
                completion(.success(url))
            } catch {
                os_log_file("[package] Feedback generation failed. (%@)", type:.error, error.fullLocalizedDescription)
                completion(.failure(error))
            }
        }
    }
    
    private class func shareFile(_ url: URL, in controller: UIViewController? = UIApplication.shared.keyWindow?.rootViewController, completion: ShareCompletion? = nil) {
        let text = "Your insights are attached and are ready to be sent for analysis."
        let subject = "Insights"
        let activityViewController = UIActivityViewController(activityItems: [text, url], applicationActivities: nil)
        activityViewController.setValue(subject, forKey: "Subject")
        activityViewController.completionWithItemsHandler = { (activityType, completed, returnedItems, activityError) in
            completion?(activityType, completed, returnedItems, activityError)
        }
        controller?.present(activityViewController, animated: true, completion: nil)
    }
}
