using Application.ATG_Classic_App.Model;
using AutoMapper;
using Edge.Core.IndustryStandardInterface.ATG;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Text;

namespace Application.ATG_Classic_App
{
    internal class RichTankInfo
    {
        internal RichTankInfo(IServiceProvider services,
            TankConfig tankConfig, TankOverallConfig tankOverallConfig, IProbeHandler probeHandler)
        {
            if (tankConfig == null || tankOverallConfig == null || probeHandler == null
                || tankConfig.TankProfileDatas == null
                || probeHandler.Probe.DeviceId != tankConfig.ProbeConfig.DeviceId)
                throw new ArgumentException("Miss or invalid configuation for Tank");

            var tankLimit = services.GetRequiredService<IMapper>().Map<TankLimit>(tankConfig.TankLimitConfig);
            var tankProduct = services.GetRequiredService<IMapper>().Map<Product>(tankConfig.ProductConfig);
            var tank = new Tank()
            {
                TankNumber = tankConfig.TankNumber,
                State = TankState.Idle,
                Label = tankConfig.Label,
                Diameter = tankConfig.Diameter,
                Limit = tankLimit,
                Probe = new Probe()
                {
                    DeviceId = tankConfig.ProbeConfig.DeviceId,
                    HardwareIdentity = probeHandler.Probe.HardwareIdentity,
                    ProbeLength = probeHandler.Probe.ProbeLength,
                    ProbeOffset = tankConfig.ProbeConfig.ProbeOffset,
                    WaterOffset = tankConfig.ProbeConfig.WaterOffset,
                },
                Product = tankProduct
            };
            this.Tank = tank;
            this.TankConfig = tankConfig;
            this.TankOverallConfig = tankOverallConfig;
        }

        public Tank Tank { get; }
        public TankConfig TankConfig { get; }
        public TankOverallConfig TankOverallConfig { get; }
    }
}