//
//  ViewController.swift
//  InAppDemo
//
//  Created by Kristian Secor on 7/11/14.
//  Copyright (c) 2014 Kristian Secor. All rights reserved.
//

import UIKit
import StoreKit


class ViewController: UIViewController,SKPaymentTransactionObserver, SKProductsRequestDelegate{
    
    //! is implicit typing ? is optional typing
    var product: SKProduct!
    @IBOutlet var productTitle : UILabel!
    @IBOutlet var buyNow : UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        SKPaymentQueue.defaultQueue().addTransactionObserver(self)
        self.getProductInfo()
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func productsRequest(request: SKProductsRequest!, didReceiveResponse response: SKProductsResponse!){
        let products = response.products
      if products.count != 0
        {
            product = products[0] as SKProduct
            productTitle.text = product.localizedTitle + "\n" + product.localizedDescription
        }
    }
    
    
    
    func getProductInfo(){
        if SKPaymentQueue.canMakePayments(){
            let productID:NSSet = NSSet(object: "com.store.gamecodes")
            let request:SKProductsRequest = SKProductsRequest(productIdentifiers: productID)
            
            request.delegate = self
            request.start()
        }
    }
    
    
    
    @IBAction func buyProduct(sender : AnyObject) {
        let payment:SKPayment = SKPayment(product: product)
        SKPaymentQueue.defaultQueue().addPayment(payment)
    }
    
      
    
    func paymentQueue(queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!){
        for transaction:AnyObject in transactions {
            if let trans:SKPaymentTransaction = transaction as? SKPaymentTransaction{
                switch trans.transactionState {
                case .Purchased:
                 SKPaymentQueue.defaultQueue().startDownloads(trans.downloads)
                    break
                case .Failed:
                    SKPaymentQueue.defaultQueue().finishTransaction(trans as SKPaymentTransaction)
                    break
                case .Restored:
                    SKPaymentQueue.defaultQueue().startDownloads(trans.downloads)
                    SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
                    break
                default:
                    break
                }
            }
        }
    }
    
    
    func paymentQueue(queue: SKPaymentQueue!, updatedDownloads downloads:[AnyObject]){
        for download:AnyObject in downloads {
            if let down:SKDownload = download as? SKDownload  {
                switch down.downloadState {
                case .Active:
                    //NSLog("progress %f",down.progress)
                    //NSLog("remaining %f",down.timeRemaining)
                    //NSLog("Active")
                    break
                case .Cancelled:
                    NSLog("%@","download cancelled")
                    break
                case .Failed:
                    NSLog("%@","download failed")
                    productTitle.text = "Download Failed"
                    break
                case .Finished:
                    var source:String = down.contentURL.relativePath!

                    
                var dict =  NSMutableDictionary(contentsOfFile: source.stringByAppendingPathComponent("ContentInfo.plist"))
                
                    
                let pathToDownloadsFolder = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.UserDomainMask, true)[0] as String
                    
                let content:String = pathToDownloadsFolder.stringByAppendingPathComponent("gamecodes.zip")
                    self.copyPathToDownloadsFolder(source,target:content)
                    SKPaymentQueue.defaultQueue().finishTransaction(down.transaction)
                    break
                case .Paused:
                        NSLog("%@","SKDownloadStatePaused")
                        break
                case .Waiting:
                        NSLog("%@","SKDownloadStateWaiting")
                        break
                default: break
                }
            }
        }
    }
  
    func copyPathToDownloadsFolder(source:String,target:String) {
        NSLog("Source is %@",source)
        NSLog("Target is %@",target)
        
        let filemgr:NSFileManager = NSFileManager.defaultManager()
        
        var error:NSError?
        
        if (filemgr.copyItemAtPath(source, toPath:target, error:&error)) {
            NSLog("Success: file is now in %@",target)
        }
        else
        {
            NSLog("Error: %@",error!)
        }
    }


}

