using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
using PepperDash.Core;
using Serilog.Events;
namespace PepperDash.Essentials.Core
{
///
/// Defines the contract for IUsageTracking
///
public interface IUsageTracking
{
UsageTracking UsageTracker { get; set; }
}
//public static class IUsageTrackingExtensions
//{
// public static void EnableUsageTracker(this IUsageTracking device)
// {
// device.UsageTracker = new UsageTracking();
// }
//}
///
/// Represents a UsageTracking
///
public class UsageTracking
{
public event EventHandler DeviceUsageEnded;
///
/// Gets or sets the InUseTracker
///
public InUseTracking InUseTracker { get; protected set; }
///
/// Gets or sets the UsageIsTracked
///
public bool UsageIsTracked { get; set; }
///
/// Gets or sets the UsageTrackingStarted
///
public bool UsageTrackingStarted { get; protected set; }
///
/// Gets or sets the UsageStartTime
///
public DateTime UsageStartTime { get; protected set; }
///
/// Gets or sets the UsageEndTime
///
public DateTime UsageEndTime { get; protected set; }
///
/// Gets or sets the Parent
///
public Device Parent { get; private set; }
public UsageTracking(Device parent)
{
Parent = parent;
InUseTracker = new InUseTracking();
InUseTracker.InUseFeedback.OutputChange += InUseFeedback_OutputChange; //new EventHandler();
}
void InUseFeedback_OutputChange(object sender, EventArgs e)
{
if(InUseTracker.InUseFeedback.BoolValue)
{
StartDeviceUsage();
}
else
{
EndDeviceUsage();
}
}
///
/// StartDeviceUsage method
///
public void StartDeviceUsage()
{
UsageTrackingStarted = true;
UsageStartTime = DateTime.Now;
}
///
/// Calculates the difference between the usage start and end times, gets the total minutes used and fires an event to pass that info to a consumer
///
public void EndDeviceUsage()
{
try
{
UsageTrackingStarted = false;
UsageEndTime = DateTime.Now;
if (UsageStartTime != null)
{
var timeUsed = UsageEndTime - UsageStartTime;
var handler = DeviceUsageEnded;
if (handler != null)
{
Debug.LogMessage(LogEventLevel.Debug, "Device Usage Ended for: {0} at {1}. In use for {2} minutes.", Parent.Name, UsageEndTime, timeUsed.Minutes);
handler(this, new DeviceUsageEventArgs() { UsageEndTime = UsageEndTime, MinutesUsed = timeUsed.Minutes });
}
}
}
catch (Exception e)
{
Debug.LogMessage(LogEventLevel.Debug, "Error ending device usage: {0}", e);
}
}
}
///
/// Represents a DeviceUsageEventArgs
///
public class DeviceUsageEventArgs : EventArgs
{
///
/// Gets or sets the UsageEndTime
///
public DateTime UsageEndTime { get; set; }
///
/// Gets or sets the MinutesUsed
///
public int MinutesUsed { get; set; }
}
}