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 { Прибавить, Вычесть }
#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, IDoubleInput0, IDoubleInput1, IDoubleReturns
{
public IContext Context { get; set; }
///
/// Тип операции
///
[HandlerParameter(true, "Вычесть", NotOptimized = false, Name = "Тип операции", IsVisibleInBlock = true)]
[Description("Тип операции: Прибавить, Вычесть. Определяет необходимое действие с временем")]
public TimeOperationType OperType { get; set; }
public IList Execute(IList timeSerie, IList minutesSerie)
{
var minutesToAddSubstract = (int)minutesSerie.FirstOrDefault();
var retValue = Context.GetArray(Context.BarsCount);
for (int i = 0; i < timeSerie.Count; i++)
{
var tsLabTime = (int)timeSerie[i];
if (tsLabTime % 1 != 0 || tsLabTime > 235959 || tsLabTime < 0)
{
retValue[i] = 0;
continue;
}
var newTime = AddSubstractMinutes(tsLabTime, minutesToAddSubstract);
retValue[i] = newTime;
}
return retValue;
}
///
/// Метод производит вычитание или прибавление периода в минутах к заданному времени
///
/// Время в формате ТСЛаб
/// Кол-во минут
/// Время в формате ТСЛаб после вычета/добавления минут
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.Прибавить ? 1 : -1), 0));
if (newTime.Hours < 0) newTime += new TimeSpan(24, 0, 0);
return newTime.Hours * 10000 + newTime.Minutes * 100 + newTime.Seconds;
}
}
}