//
//  ArticleStatusSyncTimer.swift
//  NetNewsWire
//
//  Created by Maurice Parker on 5/15/19.
//  Copyright © 2019 Ranchero Software. All rights reserved.
//

import Foundation
import Account

@MainActor final class ArticleStatusSyncTimer {

	private static let intervalSeconds = Double(120)
	
	var shuttingDown = false
	
	private var internalTimer: Timer?
	private var lastTimedRefresh: Date?
	private let launchTime = Date()
	
	func fireOldTimer() {
		if let timer = internalTimer {
			if timer.fireDate < Date() {
				timedRefresh(nil)
			}
		}
	}
	
	func invalidate() {
		guard let timer = internalTimer else {
			return
		}
		if timer.isValid {
			timer.invalidate()
		}
		internalTimer = nil
	}
	
	func update() {
		
		guard !shuttingDown else {
			return
		}
		
		let lastRefreshDate = lastTimedRefresh ?? launchTime
		var nextRefreshTime = lastRefreshDate.addingTimeInterval(ArticleStatusSyncTimer.intervalSeconds)
		if nextRefreshTime < Date() {
			nextRefreshTime = Date().addingTimeInterval(ArticleStatusSyncTimer.intervalSeconds)
		}
		if let currentNextFireDate = internalTimer?.fireDate, currentNextFireDate == nextRefreshTime {
			return
		}
		
		invalidate()
		let timer = Timer(fireAt: nextRefreshTime, interval: 0, target: self, selector: #selector(timedRefresh(_:)), userInfo: nil, repeats: false)
		RunLoop.main.add(timer, forMode: .common)
		internalTimer = timer
		
	}
	
	@objc func timedRefresh(_ sender: Timer?) {
		
		guard !shuttingDown else {
			return
		}
		
		lastTimedRefresh = Date()
		update()
		
		Task { @MainActor in
			await AccountManager.shared.syncArticleStatusAll()
		}
	}
}
