// // ServiceNotificationManager.swift // Vendoo // // Created by Okechi Onyeje on 8/30/16. // Copyright © 2016 Okechi Onyeje. All rights reserved. // import Foundation protocol ServiceNotificationManagerDelegate { func listingHasEnded(fbInfo: AnyObject?, ebayInfo: AnyObject?, amazonInfo: AnyObject?, etsyInfo: AnyObject?) func listingHasNewNotifications(fbInfo: AnyObject?, ebayInfo: AnyObject?, amazonInfo: AnyObject?, etsyInfo: AnyObject?) func listingHasFinishedRetrievingNotifications() func listingHasStartedRetrievingNotifications() } class ServiceNotificationManager: NSObject { var etsyManager: EtsyRESTAPIManager! var fbGraphManager: FacebookGraphAPIManager! var firebaseManager: FirebaseManager! var ebayGraphManager: EbayWebServiceManager! var userListings: [Listing] = [] var timer: NSTimer! static var delegate: ServiceNotificationManagerDelegate? override init() { super.init() } func startServicePolling() { // notifications can be switched to a set interval by uncommenting the following line and commenting the line below it //timer = NSTimer.scheduledTimerWithTimeInterval(1800.0, target: self, selector: #selector(ServiceNotificationManager.pollServices), userInfo: nil, repeats: true) pollServices() } func stopServicePolling() { timer.invalidate() } func setManagers(fbManager: FacebookGraphAPIManager, fireManager: FirebaseManager, ebayManager: EbayWebServiceManager, etsyManager: EtsyRESTAPIManager){ self.fbGraphManager = fbManager self.firebaseManager = fireManager self.ebayGraphManager = ebayManager self.etsyManager = etsyManager } func setListings(listings: [Listing]) { self.userListings = listings } func pollServices(){ for listing in userListings { self.firebaseManager.ref.child("Users/\(self.firebaseManager.user_email)/user_Listings/\(listing.key)").observeSingleEventOfType( .Value, withBlock: { (snapshot) -> Void in let listingDict = snapshot.value as? [String : AnyObject] if !(listingDict!["isListingDraft"] as! Bool) { if let networksDict = listingDict!["networkIDs"] as? [String : AnyObject] { let ebayID = (networksDict["ebay"] as? String) let facebookID = (networksDict["facebook"] as? String) let etsyID = (networksDict["etsy"] as? Int) let amazonID = (networksDict["amazon"] as? String) if(ebayID != nil){ if self.ebayGraphManager.isAuthorized { self.ebayGraphManager.getListingInfo(ebayID!, onComplete: { (listingNotificationInfo, error) -> Void in let info = (listingNotificationInfo as! [String : AnyObject]) if(info["status"] as! String == "Ended") { if((info["quantitySold"] as! Int) > 0) { //checks if listing is sold out if (((info["itemQuantity"] as! Int) - (info["quantitySold"] as! Int)) == 0) { ServiceNotificationManager.delegate?.listingHasNewNotifications( nil, ebayInfo: [ "type": "Sold", "notification": "Your listing \"\(listingDict!["listingTitle"] as! String)\" has sold out on ebay.", "listingKey": listing.key], amazonInfo: nil, etsyInfo: nil ) } }else{ ServiceNotificationManager.delegate?.listingHasEnded( nil, ebayInfo: [ "type": "Ended", "notification": "Your listing \"\(listingDict!["listingTitle"] as! String)\" has ended on ebay.", "listingKey": listing.key], amazonInfo: nil, etsyInfo: nil ) } } }) } } if(facebookID != nil){ if(self.fbGraphManager.isAuthorized) { //get new comments on a listing post from facebook self.fbGraphManager.getListingInfo ("/\(facebookID!)/comments", onCompletion: { (listingNotificationInfo, error) -> Void in dispatch_async(dispatch_get_main_queue(), { self.firebaseManager.ref.child("Users/\(self.firebaseManager.user_email)").observeEventType(.Value, withBlock: { (snapshot) -> Void in let notifications = ((snapshot.value as? [String : AnyObject])!["notifications"]) as? [String : AnyObject] for commentInfo in (listingNotificationInfo as! [[String: AnyObject]]) { let fromInfo = commentInfo["from"] as! [String : AnyObject] if notifications != nil { if notifications![(commentInfo["id"] as! String)] == nil { let commentDict = [ "UUID":(commentInfo["id"] as! String), "commentMessage":(commentInfo["message"] as! String), "network":"facebook", "notification": "Your item \"\(listingDict!["listingTitle"] as! String)\" has a new comment.", "key": listing.key, "seen":false, "senderID":(fromInfo["id"]! as! String), "senderName":(fromInfo["name"]! as! String), "type":"FBComment" ] ServiceNotificationManager.delegate?.listingHasNewNotifications(commentDict, ebayInfo: nil, amazonInfo: nil, etsyInfo: nil) } }else{ let commentDict = [ "UUID":(commentInfo["id"] as! String), "commentMessage":(commentInfo["message"] as! String), "network":"facebook", "notification": "Your item \"\(listingDict!["listingTitle"] as! String)\" has a new comment.", "key": listing.key, "seen":false, "senderID":(fromInfo["id"]! as! String), "senderName":(fromInfo["name"]! as! String), "type":"FBComment" ] ServiceNotificationManager.delegate?.listingHasNewNotifications(commentDict, ebayInfo: nil, amazonInfo: nil, etsyInfo: nil) } } }) }) }) } } if(etsyID != nil){ if (self.etsyManager.isAuthorized) { self.etsyManager.getListingInfo ("/listings/\(etsyID!)", onCompletion: { (listingNotificationInfo, error) -> Void in let info = (listingNotificationInfo as! [String : AnyObject]) //checks for ended unsold listings if ((info["status"] as! String == "expired") || (info["status"] as! String == "removed")) { ServiceNotificationManager.delegate?.listingHasEnded( nil, ebayInfo: nil, amazonInfo: nil, etsyInfo: [ "type": "Ended", "notification": "Your listing \"\(listingDict!["listingTitle"] as! String)\" has ended on etsy.", "listingKey": listing.key] ) //checks for sold listings }else if info["status"] as! String == "sold_out" { ServiceNotificationManager.delegate?.listingHasNewNotifications( nil, ebayInfo: nil, amazonInfo: nil, etsyInfo: [ "type": "Sold", "notification": "Your listing \"\(listingDict!["listingTitle"] as! String)\" has sold out on etsy.", "listingKey": listing.key] ) } else if info["status"] as! String == "draft" { } }) } } if(amazonID != nil){ } }else { } }else { } }) } //used to turn off notification mode for ebay so that it may operate as a request manager instead of a notification manager self.ebayGraphManager.isGettingNotification = false } }