using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Linq;
using MercatorApi;
using MercatorExtensions;
using MercatorUi;
using MercatorDatabase;

// <CompileWithRoslyn />

namespace WorkTime
{
    public class Customizer : MercatorCommonCustomizers.WorkTimeCustomizer
    {
        public override OnUpdateRet OnUpdate(OnUpdateParam p)
        {
            // 1. Verbied het verplaatsen van een registratie naar een andere dag
            if (IsDayChanged(p.Moment1Current, p.Moment1NewValue) || IsDayChanged(p.Moment2Current, p.Moment2NewValue))
            {
                return new OnUpdateRet
                {
                    DialogType = DialogTypeEnum.Stop,
                    Message = "Een registratie kan niet naar een andere dag verplaatst worden.",
                };
            }

            // 2. Vraag bevestiging als een uur met meer dan 2 uur gewijzigd wordt
            if (IsChangedByMoreThan(p.Moment1Current, p.Moment1NewValue, TimeSpan.FromHours(2)) ||
                IsChangedByMoreThan(p.Moment2Current, p.Moment2NewValue, TimeSpan.FromHours(2)))
            {
                return new OnUpdateRet
                {
                    DialogType = DialogTypeEnum.AnswerYesNo,
                    Message = "Minstens één registratie-uur werd met meer dan 2 uur gewijzigd. Wilt u deze wijziging bevestigen?",
                };
            }

            return new OnUpdateRet
            {
                DialogType = DialogTypeEnum._none,
            };
        }

        private static bool IsDayChanged(DateTime? current, DateTime? newValue)
        {
            return current.HasValue && newValue.HasValue && current.Value.Date != newValue.Value.Date;
        }

        private static bool IsChangedByMoreThan(DateTime? current, DateTime? newValue, TimeSpan tolerance)
        {
            return current.HasValue && newValue.HasValue && Math.Abs((newValue.Value - current.Value).TotalMinutes) > tolerance.TotalMinutes;
        }
    }
}