//
// Copyright 2023, 2024 New Vector Ltd.
//
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
// Please see LICENSE files in the repository root for full details.
//

import SwiftUI

struct AppActivityView: UIViewControllerRepresentable {
    typealias UIViewControllerType = UIActivityViewController
    typealias CompletionType = (Result<(activity: UIActivity.ActivityType, items: [Any]?), Error>) -> Void

    private let activityItems: [Any]
    private let applicationActivities: [UIActivity]?
    private var excludedActivityTypes: [UIActivity.ActivityType]
    private var onCancel: (() -> Void)?
    private var onComplete: CompletionType?

    init(activityItems: [Any],
         applicationActivities: [UIActivity]? = nil,
         excludedActivityTypes: [UIActivity.ActivityType] = [],
         onCancel: (() -> Void)? = nil,
         onComplete: CompletionType? = nil) {
        self.activityItems = activityItems
        self.applicationActivities = applicationActivities
        self.excludedActivityTypes = excludedActivityTypes
        self.onCancel = onCancel
        self.onComplete = onComplete
    }

    func makeUIViewController(context: Context) -> UIViewControllerType {
        let viewController = UIViewControllerType(activityItems: activityItems, applicationActivities: applicationActivities)
        viewController.excludedActivityTypes = excludedActivityTypes

        viewController.completionWithItemsHandler = { activity, completed, items, error in
            if let error {
                onComplete?(.failure(error))
            } else if let activity, completed {
                onComplete?(.success((activity, items)))
            } else if !completed {
                onCancel?()
            } else {
                assertionFailure()
            }
        }

        return viewController
    }

    func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) { }

    static func dismantleUIViewController(_ uiViewController: UIViewControllerType, coordinator: Coordinator) {
        uiViewController.completionWithItemsHandler = nil
    }
}
