//
//  SendAppOperation.swift
//  AltStore
//
//  Created by Riley Testut on 6/7/19.
//  Copyright © 2019 Riley Testut. All rights reserved.
//
import Foundation
import Network

import AltStoreCore
import minimuxer

@objc(SendAppOperation)
final class SendAppOperation: ResultOperation<()>
{
    let context: InstallAppOperationContext
    
    private let dispatchQueue = DispatchQueue(label: "com.sidestore.SendAppOperation")
    
    init(context: InstallAppOperationContext)
    {
        self.context = context
        
        super.init()
        
        self.progress.totalUnitCount = 1
    }
    
    override func main()
    {
        super.main()
        
        if let error = self.context.error
        {
            return self.finish(.failure(error))
        }
        
        guard let resignedApp = self.context.resignedApp else {
            return self.finish(.failure(OperationError.invalidParameters("SendAppOperation.main: self.resignedApp is nil")))
        }
        
        Logger.sideload.notice("Sending app \(self.context.bundleIdentifier, privacy: .public) to AltServer \(server.localizedName ?? "nil", privacy: .public)...")
        
        // self.context.resignedApp.fileURL points to the app bundle, but we want the .ipa.
        let app = AnyApp(name: resignedApp.name, bundleIdentifier: self.context.bundleIdentifier, url: resignedApp.fileURL, storeApp: nil)
        let fileURL = InstalledApp.refreshedIPAURL(for: app)
        
        print("AFC App `fileURL`: \(fileURL.absoluteString)")
        
        if let data = NSData(contentsOf: fileURL) {
            do {
                let bytes = Data(data).toRustByteSlice()
                try yeet_app_afc(app.bundleIdentifier, bytes.forRust())
                self.progress.completedUnitCount += 1
                self.finish(.success(()))
            } catch {
                self.finish(.failure(MinimuxerError.RwAfc))
                self.progress.completedUnitCount += 1
                self.finish(.success(()))
            }
        } else {
            print("IPA doesn't exist????")
            self.finish(.failure(OperationError(.appNotFound(name: resignedApp.name))))
        }
    }
}
