using System;
using Wayne.Lib;
using Wayne.Lib.Log;

namespace Wayne.ForecourtControl.Fusion
{
    internal class FUSIONNozzle : INozzle, IIdentifiableEntity
    {
        // Fields
        private int fuelGrade;
        private int id;
        private NozzleState nozzleState = NozzleState.In;
        private FUSIONPump pump;
        private IIdentifiableEntity parentDevice;
        private int primaryTankGroupId;
        private int primaryTankGroupPercentage;
        private int secondaryTankGroupId;

        private FUSIONManager manager;
        private readonly DebugLogger debugLogger;

        // Methods
        public FUSIONNozzle(int id, FUSIONManager manager, FUSIONPump pump)
        {
            this.id = id;
            this.pump = pump;
            this.manager = manager;
            debugLogger = manager.DebugLogger;
        }

        internal void Dispose()
        {
        }

        public void ReadPumpAccumulatorAsync(EventHandler<AsyncCompletedEventArgs<PumpAccumulatorReading>> accumulatorsRead, object userToken)
        {
            this.pump.Manager.ifsfManager.GetFuelPointTotals(this.pump.realId, this.id, accumulatorsRead, userToken, this);
        }

        // Properties
        public string EntitySubType
        {
            get
            {
                return "";
            }
        }

        public string EntityType
        {
            get
            {
                return "Nozzle";
            }
        }

        /// <summary>
        /// This is used by the logger and should never be set by inheriting classes
        /// </summary>
        public string FullEntityName { get; set; }

        public int FuelGrade
        {
            get
            {
                if (manager.FuelGradeShift != 0)
                    return this.fuelGrade + manager.FuelGradeShift;
                else
                    return this.fuelGrade;
            }
        }

        /// <summary>
        /// use this property to move the values internally, this removes interference from the fuelgradeshift
        /// </summary>
        internal int WritableFuelGrade
        {
            get { return this.fuelGrade; }
            set { this.fuelGrade = value; }
        }

        public int Id
        {
            get
            {
                if (pump.Manager.IdNozzleShift > 0)
                    return this.id + pump.Manager.IdNozzleShift;
                else
                    return this.id + pump.Manager.IdShift;
            }
        }

        public int realId
        {
            get
            {
                return this.id;
            }
            set
            {
                this.id = value;
            }
        }

        public IIdentifiableEntity ParentEntity
        {
            get
            {
                return this.parentDevice;
            }
        }

        public int PrimaryTankGroupId
        {
            get
            {
                return this.primaryTankGroupId;
            }
            set
            {
                this.primaryTankGroupId = value;
            }
        }

        public int PrimaryTankGroupPercentage
        {
            get
            {
                return this.primaryTankGroupPercentage;
            }
            set
            {
                this.primaryTankGroupPercentage = value;
            }
        }

        public int SecondaryTankGroupId
        {
            get
            {
                return this.secondaryTankGroupId;
            }
            set
            {
                this.secondaryTankGroupId = value;
            }
        }


        /// <summary>
        /// Tank that nozzle is connected to 
        /// </summary>
        public int PrimaryTankNo { get; set; }

        /// <summary>
        /// Tank that nozzle is connected to 
        /// </summary>
        public int SecondaryTankNo { get; set; }


        public NozzleState State
        {
            get
            {
                return this.nozzleState;
            }
            set
            {
                if (debugLogger.IsActive())
                    debugLogger.Add(string.Format("old State={0}, new State={1}", nozzleState, value));
                if (this.nozzleState != value)
                {
                    this.nozzleState = value;

                    pump.NozzleStateChange(this, this.nozzleState);
                }
            }
        }
    }


}