using Edge.Core.IndustryStandardInterface.ATG;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Edge.WebHost
{
    public class MockAutoTankGaugeController : IAutoTankGaugeController
    {
        public string MetaConfigName => "I'm a mock controller";

        public int DeviceId => 999;

        //private List<Tank> tanks;
        public IEnumerable<Tank> Tanks { get; }

        public SystemUnit SystemUnit { get; }

        public AtgState State => throw new NotImplementedException();

        public event EventHandler<AtgStateChangeEventArg> OnStateChange;
        public event EventHandler<AtgAlarmEventArg> OnAlarm;

        public MockAutoTankGaugeController(List<Tank> tanks, SystemUnit systemUnit)
        {
            this.Tanks = tanks;
            this.SystemUnit = systemUnit;
        }

        public void FireOnStateChangeEvent(AtgState state)
        {
            var safe = this.OnStateChange;
            safe?.Invoke(this, new AtgStateChangeEventArg(state,""));
        }

        public Task<IEnumerable<Delivery>> GetTankDeliveryAsync(int tankNumber, int pageRowCount = 10, int pageIndex = 0, DateTime? filterTimestamp = null)
        {
            //if (tankNumber.HasValue)
            //    if (!this.Tanks.Select(t => t.TankNumber).Contains((byte)tankNumber)) throw new ArgumentException("Controller does not have such a tank with number: " + tankNumber.Value);
            if (tankNumber == null)
            {
                return Task.FromResult(this.Tanks.Select(t => new Edge.Core.IndustryStandardInterface.ATG.Delivery()
                {
                    TankNumber = t.TankNumber,
                    StartingDateTime = DateTime.Now.Subtract(new TimeSpan(24 + t.TankNumber * 24, 0, 0)),
                    EndingDateTime = DateTime.Now.Subtract(new TimeSpan(24 + t.TankNumber * 24, 10, 0)),
                }));
            }
            else
            {
                return Task.FromResult(this.Tanks.Where(t => t.TankNumber == tankNumber)
                    .Select(t => new Edge.Core.IndustryStandardInterface.ATG.Delivery()
                    {
                        TankNumber = t.TankNumber,
                        StartingDateTime = DateTime.Now.Subtract(new TimeSpan(24 + t.TankNumber * 24, 0, 0)),
                        EndingDateTime = DateTime.Now.Subtract(new TimeSpan(24 + t.TankNumber * 24, 10, 0)),
                    }));
            }
        }


        

        public async Task<TankReading> GetTankReadingAsync(int tankNumber)
        {
            return new TankReading()
            {
                Height = 1800 - new Random().Next(100, 1000),
                Water = 0 + new Random().Next(10, 500),
                Temperature = 20 + new Random().Next(1, 30),
                Volume = 4000 + new Random().Next(100, 2000),
                WaterVolume = 100 + new Random().Next(2, 200),
            };
        }

        public Task<IEnumerable<Inventory>> GetTankInventoryAsync(int tankNumber, int pageRowCount = 10, int pageIndex = 0, DateTime? filterTimestamp = null)
        {
            throw new NotImplementedException();
        }

        public Task<IEnumerable<Alarm>> GetTankAlarmAsync(int tankNumber, int pageRowCount = 10, int pageIndex = 0, DateTime? filterTimestamp = null)
        {
            throw new NotImplementedException();
        }

        public Task<IEnumerable<TankReading>> GetTanksReadingAsync()
        {
            throw new NotImplementedException();
        }

        //public async Task<IEnumerable<TankReadingDto>> GetTankReadingAsync(int? tankNumber)
        //{
        //    List<TankReadingDto> tankReadings = new List<TankReadingDto>();
        //    foreach (var tank in this.Tanks)
        //    {
        //        var reading = new TankReadingDto
        //        {
        //            tankNumber = tank.TankNumber,
        //            Height = 1800 - new Random().Next(100, 1000),
        //            Water = 0 + new Random().Next(10, 500),
        //            Temperature = 20 + new Random().Next(1, 30),
        //            Volume = 4000 + new Random().Next(100, 2000),
        //            WaterVolume = 100 + new Random().Next(2, 200),
        //        };
        //        tankReadings.Add(reading);
        //    };

        //    if (tankNumber.HasValue)
        //        return tankReadings.Where(r => r.tankNumber == tankNumber.Value);
        //    else
        //        return tankReadings;
        //}
    }
}