using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using TSLab.Script.Handlers;
using TSLab.Script.Handlers.Options;
namespace GanovCubes
{
public enum TimeOperationType { Add, Subtract }
#region CubeDescription
[System.Obsolete]
[HandlerCategory("Ganov Cubes. DateTime")]
[HandlerName("AddSubtractTime", Language = "ru-ru")]
[Description("Кубик принимает на вход время формата ТСЛаб и число минут, которые надо вычесть или прибавить от/к указанного времени." +
" Если на вход в качестве времени поступает число имеющее дробную часть, число больше 235959, отрицательное число, то кубик вернет значение \"ноль\"." +
" В качестве минут можно подавать как положительные, так и отрицательные числа. Дробная часть значения минут откидывается и в расчете используется" +
" только целая часть, например, если подать 22.47 минут, то в расчете будет использовано 22 минуты." +
"\nКубик имеет следующие входы: " +
"\n======================" +
"\nДата - время, над которым будет производиться операция сложения или вычитания" +
"\nДни - количество минут, которые надо прибавить или вычесть из времени")]
[HelperLink("http://forum.tslab.ru/ubb/ubbthreads.php?ubb=showflat&Number=87167&page=1", "Описание на форуме ТСлаб", "ru-ru")]
[InputsCount(2)]
[Input(0, TemplateTypes.DOUBLE, Name = "Время")]
[Input(1, TemplateTypes.DOUBLE, Name = "Минуты")]
[OutputsCount(1)]
[OutputType(TemplateTypes.DOUBLE)]
#endregion
public class AddSubtractTime : IContextUses, IStreamHandler, IValuesHandler, IDoubleInput0, IDoubleInput1, IDoubleReturns
{
public IContext Context { get; set; }
///
/// Тип операции
///
[HandlerParameter(true, "Subtract", NotOptimized = false, Name = "Тип операции", IsVisibleInBlock = true)]
[Description("Тип операции: Прибавить, Вычесть. Определяет необходимое действие с временем")]
public TimeOperationType OperType { get; set; } = TimeOperationType.Subtract;
///
/// Метод рассчитывает время с учетом сдвига на определенное кол-во минут назад или вперед
///
/// Время
/// Сдвиг по времени в минутах
/// Время с учетом сдвига в минутах
public double Execute(double time, double minutesToAddSubtract)
{
return GetBarTime(time, minutesToAddSubtract);
}
///
/// Метод формируем колллекцию времени с учетом сдвига на определенное кол-во минут назад или вперед
///
/// Время
/// Сдвиг по времени в минутах
/// Коллецию времени с учетом сдвига в минутах
public IList Execute(IList timeSerie, IList minutesSerie)
{
var minutesToAddSubtract = minutesSerie.FirstOrDefault();
var retValue = Context.GetArray(Context.BarsCount);
for (int i = 0; i < timeSerie.Count; i++)
{
var tsLabTime = timeSerie[i];
var newTime = GetBarTime(tsLabTime, minutesToAddSubtract);
retValue[i] = newTime;
}
return retValue;
}
///
/// Метод осуществляет получение единичного значения времени на баре или в режиме
/// единичного вычислени
///
/// Время бара
/// Количество минут, которые надо вычесть или прибавить
/// Время после прибавления вычитания в формате ТСЛаб
private double GetBarTime(double barTime, double minutesToAddSubtract)
{
if (barTime % 1 != 0 || barTime > 235959 || barTime < 0) return 0;
return AddSubstractMinutes((int)barTime, (int)minutesToAddSubtract);
}
///
/// Метод производит вычитание или прибавление периода в минутах к заданному времени
///
/// Время в формате ТСЛаб
/// Кол-во минут
/// Время в формате ТСЛаб после вычета/добавления минут
private double AddSubstractMinutes(int tsLabInitTime, int minutesToAddSubstract)
{
var hours = tsLabInitTime / 10000;
var minutes = tsLabInitTime % 10000 / 100;
var seconds = tsLabInitTime % 10000 % 100;
var newTime = new TimeSpan(hours, minutes, seconds).Add(new TimeSpan(0, minutesToAddSubstract * (OperType == TimeOperationType.Add ? 1 : -1), 0));
if (newTime.Hours < 0) newTime += new TimeSpan(24, 0, 0);
return newTime.Hours * 10000 + newTime.Minutes * 100 + newTime.Seconds;
}
}
}