using System;
using System.Collections.Generic;
//using System.Linq;
using System.Threading;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Net;
using System.Net.Sockets;
using System.Diagnostics;

using Wayne.FDCPOSLibrary;
using Wayne.OptInterface;
using Microsoft.Extensions.Logging;

namespace Wayne.FDCPOSInterface.Configuration
{
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface IConfigurationInterface
    {
        //[DispId(1)]
        //void Start(int iIPPortConfig, bool encryptedHeader, string forecourtConfiguration, int version, bool useExtensions, string certificate);

        [DispId(2)]
        void Test();


        //[DispId(1)]
        //void ConfigStartResponse(bool accepted, int errorCode);

        //[DispId(2)]
        //void ConfigEndResponse(bool accepted, int errorCode);

        //[DispId(3)]
        //void AddGradeResponse(bool accepted, int errorCode);

        //[DispId(4)]
        //void AddAssignGradeParResponse(bool accepted, int errorCode);

        //[DispId(5)]
        //void AddTankResponse(bool accepted, int errorCode);

        //[DispId(6)]
        //void AddFuelModeResponse(bool accepted, int errorCode);

        //[DispId(7)]
        //void SetFuellingModesResponse(bool accepted, int errorCode);

        //[DispId(8)]
        //void AddFuelPointResponse(bool accepted, int errorCode);

        //[DispId(9)]
        //void AssignGradeResponse(bool accepted, int errorCode);

        //[DispId(10)]
        //void AssignMeterResponse(bool accepted, int errorCode);

        //[DispId(11)]
        //void AssignTanksResponse(bool accepted, int errorCode);

        //[DispId(12)]
        //void DefPricePoleResponse(bool accepted, int errorCode);

        //[DispId(13)]
        //void LoadPricesetResponse(bool accepted, int errorCode);
    }

    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    [Guid("BF929A3C-BBD4-4b85-8FB9-400BADCE4BDB")]
    public interface IConfigurationInterfaceEvents
    {
        [DispId(1)]
        int OnConfigStart();

        [DispId(2)]
        int OnConfigEnd();

        [DispId(3)]
        int OnAddGrade(int id);
        [DispId(4)]
        int OnAddGradeEnd();

        [DispId(5)]
        int OnAddAssignGradePar(int id, string name);
        [DispId(6)]
        int OnAddAssignGradeParsEnd();

        [DispId(7)]
        int OnAddTank(int id);
        [DispId(8)]
        int OnAddTanksEnd();

        [DispId(9)]
        int OnAddFuelMode(int id, string name, int authType, int maxAuthTime, int nozzleLayDownTime, int minGuardTime, int paymentType, double minVolume, double minMoney, int SupTransBufSize);
        [DispId(10)]
        int OnAddFuelModeEnd();

        [DispId(11)]
        int OnSetFuellingModes(int fuellingType, double maxVolume, double maxMoney, int maxFuellingTime, int maxTimeNoProgress, int maxTimeToMinLimit, int presetOverrunLimit);

        [DispId(12)]
        int OnAddFuelPoint(int id, int pumpType, int comChannelId, string IPAddress, int IPPort, int physicalAddress, int internalAddress);
        [DispId(13)]
        int OnAddNozzle(int pumpId, int nozzleId);
        [DispId(14)]
        int OnAddFuelPointsEnd();

        [DispId(15)]
        int OnAssignGrade(int pumpId, int nozzleId, int gradeId);
        [DispId(16)]
        int OnAssignGradesEnd();

        [DispId(17)]
        int OnAssignMeter(int pumpId, int gradeId, int meterId, int part);
        [DispId(18)]
        int OnAssignMetersEnd();

        [DispId(19)]
        int OnAssignTank(int pumpId, int meterId, int tankId);
        [DispId(20)]
        int OnAssignTanksEnd();

        [DispId(21)]
        int OnAddPricePole(int id, int type, int physicalAddress, int COMPort);
        [DispId(22)]
        int OnAddPricePoleRow(int id, int gradeId, int fuelMode, int position);
        [DispId(23)]
        int OnAddPricePoleEnd();

        [DispId(24)]
        int OnLoadPriceset(int id, int gradeId, double price);
        [DispId(25)]
        int OnLoadPricesetEnd();
    }

    [Guid("818DBBB1-0A4E-49b9-BE0D-269F5F14D759")]
    [ClassInterface(ClassInterfaceType.None)]
    [ComVisible(true)]
    [ProgId("Configuration.ConfigurationInterface")]
    [ComSourceInterfaces(typeof(IConfigurationInterfaceEvents))]
    public class ConfigurationInterface : IConfigurationInterface
    {
        private ILogger logger;
        [ComVisible(false)]
        public ConfigurationMessages messages;
        [ComVisible(false)]
        FDCPOSConfigurationManager fdcposManager;


        //public static IConfigurationInterface CreateConfigurationInterface()
        //{
        //    return new ConfigurationInterface();
        //}

        // Remember! the constructor cannot have parameters when called from COM CreateInstance
        public ConfigurationInterface(ILogger logger)
        {
            //FDCPOSManager.tracer.WriteLine("init");
            this.logger = logger;
            if (FDCPOSConfigurationManager.fdcposManager == null)
                FDCPOSConfigurationManager.fdcposManager = new FDCPOSConfigurationManager();
            FDCPOSConfigurationManager.fdcposManager.configurationInterface = this;
            fdcposManager = FDCPOSConfigurationManager.fdcposManager;

            messages = new ConfigurationMessages(fdcposManager, this.logger);
            //TODO tcpClientList = new Dictionary<string, FDCPOSClient>();

            //FDCPOSManager.tracer.WriteLine("end");
        }

        public void Disconnect(string workstationID, string applicationSender)
        {
            //if (fdcposInterface.OnClientDisconnected != null)
            //    fdcposInterface.OnClientDisconnected(tcpClientList[fdcposClient.sID].workstationID, tcpClientList[fdcposClient.sID].applicationSender);

        }

        public delegate int OnConfigStartTarget();
        public delegate int OnConfigEndTarget();
        public delegate int OnAddGradeTarget(int id);
        public delegate int OnAddGradeEndTarget();
        public delegate int OnAddAssignGradeParTarget(int id, string name);
        public delegate int OnAddAssignGradeParsEndTarget();
        public delegate int OnAddTankTarget(int id);
        public delegate int OnAddTanksEndTarget();
        public delegate int OnAddFuelModeTarget(int id, string name, int authType, int maxAuthTime, int nozzleLayDownTime, int minGuardTime, int paymentType, double minVolume, double minMoney, int SupTransBufSize);
        public delegate int OnAddFuelModeEndTarget();
        public delegate int OnSetFuellingModesTarget(int fuellingType, double maxVolume, double maxMoney, int maxFuellingTime, int maxTimeNoProgress, int maxTimeToMinLimit, int presetOverrunLimit);
        public delegate int OnAddFuelPointTarget(int id, int pumpType, int comChannelId, string IPAddress, int IPPort, int physicalAddress, int internalAddress);
        public delegate int OnAddNozzleTarget(int pumpId, int nozzleId);
        public delegate int OnAddFuelPointsEndTarget();
        public delegate int OnAssignGradeTarget(int pumpId, int nozzleId, int gradeId);
        public delegate int OnAssignGradesEndTarget();
        public delegate int OnAssignMeterTarget(int pumpId, int gradeId, int meterId, int part);
        public delegate int OnAssignMetersEndTarget();
        public delegate int OnAssignTankTarget(int pumpId, int meterId, int tankId);
        public delegate int OnAssignTanksEndTarget();
        public delegate int OnAddPricePoleTarget(int id, int type, int physicalAddress, int COMPort);
        public delegate int OnAddPricePoleRowTarget(int id, int gradeId, int fuelMode, int position);
        public delegate int OnAddPricePoleEndTarget();
        public delegate int OnLoadPricesetTarget(int id, int gradeId, double price);
        public delegate int OnLoadPricesetEndTarget();


        public event OnConfigStartTarget OnConfigStart;
        public event OnConfigEndTarget OnConfigEnd;
        public event OnAddGradeTarget OnAddGrade;
        public event OnAddGradeEndTarget OnAddGradeEnd;
        public event OnAddAssignGradeParTarget OnAddAssignGradePar;
        public event OnAddAssignGradeParsEndTarget OnAddAssignGradeParsEnd;
        public event OnAddTankTarget OnAddTank;
        public event OnAddTanksEndTarget OnAddTanksEnd;
        public event OnAddFuelModeTarget OnAddFuelMode;
        public event OnAddFuelModeEndTarget OnAddFuelModeEnd;
        public event OnSetFuellingModesTarget OnSetFuellingModes;
        public event OnAddFuelPointTarget OnAddFuelPoint;
        public event OnAddNozzleTarget OnAddNozzle;
        public event OnAddFuelPointsEndTarget OnAddFuelPointsEnd;
        public event OnAssignGradeTarget OnAssignGrade;
        public event OnAssignGradesEndTarget OnAssignGradesEnd;
        public event OnAssignMeterTarget OnAssignMeter;
        public event OnAssignMetersEndTarget OnAssignMetersEnd;
        public event OnAssignTankTarget OnAssignTank;
        public event OnAssignTanksEndTarget OnAssignTanksEnd;
        public event OnAddPricePoleTarget OnAddPricePole;
        public event OnAddPricePoleRowTarget OnAddPricePoleRow;
        public event OnAddPricePoleEndTarget OnAddPricePoleEnd;
        public event OnLoadPricesetTarget OnLoadPriceset;
        public event OnLoadPricesetEndTarget OnLoadPricesetEnd;

        //public void Start(int iIPPortConfig, bool encryptedHeader, string forecourtConfiguration, int version, bool useExtensions, string certificate)
        //{
        //    //FDCPOSManager.tracer.WriteLine(string.Format("init: port={0}, encryptedHeader={1}, version={2}, extension={3}, certificate={4}", iIPPortConfig, encryptedHeader, version, useExtensions, certificate));
        //    messages.Start(iIPPortConfig, encryptedHeader, forecourtConfiguration, version, useExtensions, certificate);
        //    //FDCPOSManager.tracer.WriteLine("end");
        //}

        public void Test()
        {
            // TEMP init
            if (this.OnConfigStart != null)
            {
                //string sValue = IniFile.IniReadValue(SINPConfigurazione.IniPath + "ForecourtServer.ini", "Test", "Operation");
                //if (sValue == "Test1")
                //{
                //    //FDCPOSManager.tracer.WriteLine("calling testConfig1");
                //    testConfig1();
                //    //FDCPOSManager.tracer.WriteLine("called testConfig1");
                //}
                //else if (sValue == "Test2")
                //{
                //    //FDCPOSManager.tracer.WriteLine("calling testConfig2");
                //    testConfig2();
                //    //FDCPOSManager.tracer.WriteLine("called testConfig2");
                //}
                //else if (sValue == "Test3")
                //{
                //    //FDCPOSManager.tracer.WriteLine("calling testConfig3");
                //    testConfig3();
                //    //FDCPOSManager.tracer.WriteLine("called testConfig3");
                //}
            }
            // TEMP end
        }


        void testConfig1()
        {
            this.OnConfigStart();
            this.OnAddGrade(1);
            this.OnAddGrade(2);
            this.OnAddGrade(3);
            this.OnAddGradeEnd();

            this.OnAddAssignGradePar(1, ("BLUDIESEL"));
            this.OnAddAssignGradePar(2, ("GASOLIO"));
            this.OnAddAssignGradePar(3, ("SUPERSP"));
            this.OnAddAssignGradeParsEnd();

            this.OnAddTank(1);
            this.OnAddTank(2);
            this.OnAddTank(3);
            this.OnAddTanksEnd();

            this.OnAddFuelPoint(1, 1/*FDC_PUMP_NUOVOPIGNONE_CL1*/, 6, "", 0, 1, 1);
            this.OnAddFuelPoint(2, 2/*FDC_PUMP_NUOVOPIGNONE_CL2*/, 7, "", 0, 1, 1);
            this.OnAddNozzle(1, 1);
            this.OnAddNozzle(1, 2);
            this.OnAddNozzle(1, 3);
            this.OnAddNozzle(2, 1);
            this.OnAddNozzle(2, 2);
            this.OnAddFuelPointsEnd();

            this.OnAssignGrade(1, 1, 1);
            this.OnAssignGrade(1, 2, 2);
            this.OnAssignGrade(1, 3, 3);
            this.OnAssignGrade(2, 1, 1);
            this.OnAssignGrade(2, 2, 2);
            this.OnAssignGradesEnd();

            this.OnAssignMeter(1, 1, 1, 0);
            this.OnAssignMeter(1, 2, 2, 0);
            this.OnAssignMeter(1, 3, 3, 0);
            this.OnAssignMeter(2, 1, 1, 0);
            this.OnAssignMeter(2, 2, 2, 0);
            this.OnAssignMetersEnd();

            this.OnAssignTank(1, 1, 1);
            this.OnAssignTank(1, 2, 2);
            this.OnAssignTank(1, 3, 3);
            this.OnAssignTank(2, 1, 1);
            this.OnAssignTank(2, 2, 2);
            this.OnAssignTanksEnd();

            this.OnConfigEnd();
        }

        void testConfig2()
        {
            this.OnConfigStart();
            this.OnAddGrade(1);
            this.OnAddGrade(2);
            this.OnAddGrade(3);
            this.OnAddGrade(4);
            this.OnAddGradeEnd();

            this.OnAddAssignGradePar(1, ("BLUDIESEL"));
            this.OnAddAssignGradePar(2, ("GASOLIO"));
            this.OnAddAssignGradePar(3, ("SUPERSP"));
            this.OnAddAssignGradePar(4, ("GPL"));
            this.OnAddAssignGradeParsEnd();

            this.OnAddTank(1);
            this.OnAddTank(2);
            this.OnAddTank(3);
            this.OnAddTank(4);
            this.OnAddTanksEnd();

            this.OnAddFuelPoint(1, 99/*FDC_PUMP_BOGUS*/, 6, "", 0, 1, 1);
            this.OnAddFuelPoint(2, 99/*FDC_PUMP_BOGUS*/, 7, "", 0, 2, 2);
            this.OnAddFuelPoint(3, 99/*FDC_PUMP_BOGUS*/, 8, "", 0, 3, 3);
            this.OnAddFuelPoint(4, 99/*FDC_PUMP_BOGUS*/, 9, "", 0, 4, 4);
            this.OnAddNozzle(1, 1);
            this.OnAddNozzle(1, 2);
            this.OnAddNozzle(1, 3);
            this.OnAddNozzle(2, 1);
            this.OnAddNozzle(2, 2);
            this.OnAddNozzle(2, 3);
            this.OnAddNozzle(3, 1);
            this.OnAddNozzle(3, 2);
            this.OnAddNozzle(3, 3);
            this.OnAddNozzle(4, 1);
            this.OnAddFuelPointsEnd();

            this.OnAssignGrade(1, 1, 1);
            this.OnAssignGrade(1, 2, 2);
            this.OnAssignGrade(1, 3, 3);
            this.OnAssignGrade(2, 1, 1);
            this.OnAssignGrade(2, 2, 2);
            this.OnAssignGrade(2, 3, 3);
            this.OnAssignGrade(3, 1, 1);
            this.OnAssignGrade(3, 2, 2);
            this.OnAssignGrade(3, 3, 3);
            this.OnAssignGrade(4, 1, 4);
            this.OnAssignGradesEnd();

            this.OnAssignMeter(1, 1, 1, 0);
            this.OnAssignMeter(1, 2, 2, 0);
            this.OnAssignMeter(1, 3, 3, 0);
            this.OnAssignMeter(2, 1, 1, 0);
            this.OnAssignMeter(2, 2, 2, 0);
            this.OnAssignMeter(2, 3, 3, 0);
            this.OnAssignMeter(3, 1, 1, 0);
            this.OnAssignMeter(3, 2, 2, 0);
            this.OnAssignMeter(3, 3, 3, 0);
            this.OnAssignMeter(4, 4, 4, 0);
            this.OnAssignMetersEnd();

            this.OnAssignTank(1, 1, 1);
            this.OnAssignTank(1, 2, 2);
            this.OnAssignTank(1, 3, 3);
            this.OnAssignTank(2, 1, 1);
            this.OnAssignTank(2, 2, 2);
            this.OnAssignTank(2, 3, 3);
            this.OnAssignTank(3, 1, 1);
            this.OnAssignTank(3, 2, 2);
            this.OnAssignTank(3, 3, 3);
            this.OnAssignTank(4, 4, 4);
            this.OnAssignTanksEnd();

            this.OnConfigEnd();
        }

        void testConfig3()
        {
            this.OnConfigStart();
            this.OnAddGrade(1);
            this.OnAddGrade(2);
            this.OnAddGrade(3);
            this.OnAddGradeEnd();

            this.OnAddAssignGradePar(1, ("BLUDIESEL"));
            this.OnAddAssignGradePar(2, ("GASOLIO"));
            this.OnAddAssignGradePar(3, ("SUPERSP"));
            this.OnAddAssignGradeParsEnd();

            this.OnAddTank(1);
            this.OnAddTank(2);
            this.OnAddTank(3);
            this.OnAddTanksEnd();

            this.OnAddFuelPoint(1, 99/*FDC_PUMP_BOGUS*/, 6, "", 0, 1, 1);
            this.OnAddFuelPoint(2, 99/*FDC_PUMP_BOGUS*/, 7, "", 0, 2, 2);
            this.OnAddNozzle(1, 1);
            this.OnAddNozzle(1, 2);
            this.OnAddNozzle(1, 3);
            this.OnAddNozzle(2, 1);
            this.OnAddNozzle(2, 2);
            this.OnAddNozzle(2, 3);
            this.OnAddFuelPointsEnd();

            this.OnAssignGrade(1, 1, 1);
            this.OnAssignGrade(1, 2, 2);
            this.OnAssignGrade(1, 3, 3);
            this.OnAssignGrade(2, 1, 1);
            this.OnAssignGrade(2, 2, 2);
            this.OnAssignGrade(2, 3, 3);
            this.OnAssignGradesEnd();

            this.OnAssignMeter(1, 1, 1, 0);
            this.OnAssignMeter(1, 2, 2, 0);
            this.OnAssignMeter(1, 3, 3, 0);
            this.OnAssignMeter(2, 1, 1, 0);
            this.OnAssignMeter(2, 2, 2, 0);
            this.OnAssignMeter(2, 3, 3, 0);
            this.OnAssignMetersEnd();

            this.OnAssignTank(1, 1, 1);
            this.OnAssignTank(1, 2, 2);
            this.OnAssignTank(1, 3, 3);
            this.OnAssignTank(2, 1, 1);
            this.OnAssignTank(2, 2, 2);
            this.OnAssignTank(2, 3, 3);
            this.OnAssignTanksEnd();

            this.OnConfigEnd();
        }


        #region Requests
        public int ConfigStart()
        {
            int result = (int)ErrorCode.ERRCD_OK;
            //FDCPOSManager.tracer.WriteLine("ConfigStart init");
            if (OnConfigStart != null)
            {
                result = OnConfigStart();
            }
            else
                result = (int)ErrorCode.ERRCD_CTRLERR;
            //FDCPOSManager.tracer.WriteLine(string.Format("ConfigStart end: return result={0}", result));
            return result;
        }

        public int ConfigEnd()
        {
            int result = (int)ErrorCode.ERRCD_OK;
            //FDCPOSManager.tracer.WriteLine("ConfigEnd init");
            if (OnConfigEnd != null)
            {
                result = OnConfigEnd();
            }
            else
                result = (int)ErrorCode.ERRCD_CTRLERR;
            //FDCPOSManager.tracer.WriteLine(string.Format("ConfigEnd end: return result={0}", result));
            return result;
        }

        public int AddGrade(int id)
        {
            int result = (int)ErrorCode.ERRCD_OK;
            //FDCPOSManager.tracer.WriteLine("init");
            if (OnAddGrade != null)
            {
                result = OnAddGrade(id);
            }
            else
                result = (int)ErrorCode.ERRCD_CTRLERR;
            //FDCPOSManager.tracer.WriteLine(string.Format("AddGrade end: return result={0}", result));
            return result;
        }

        public int AddGradeEnd()
        {
            int result = (int)ErrorCode.ERRCD_OK;
            //FDCPOSManager.tracer.WriteLine("init");
            if (OnAddGradeEnd != null)
            {
                result = OnAddGradeEnd();
            }
            else
                result = (int)ErrorCode.ERRCD_CTRLERR;
            //FDCPOSManager.tracer.WriteLine(string.Format("AddGradeEnd end: return result={0}", result));
            return result;
        }

        public int AddAssignGradePar(int id, string name)
        {
            int result = (int)ErrorCode.ERRCD_OK;
            //FDCPOSManager.tracer.WriteLine("init");
            if (OnAddAssignGradePar != null)
            {
                result = OnAddAssignGradePar(id, name);
            }
            else
                result = (int)ErrorCode.ERRCD_CTRLERR;
            //FDCPOSManager.tracer.WriteLine(string.Format("AddAssignGradePar end: return result={0}", result));
            return result;
        }

        public int AddAssignGradeParsEnd()
        {
            int result = (int)ErrorCode.ERRCD_OK;
            //FDCPOSManager.tracer.WriteLine("init");
            if (OnAddAssignGradeParsEnd != null)
            {
                result = OnAddAssignGradeParsEnd();
            }
            else
                result = (int)ErrorCode.ERRCD_CTRLERR;
            //FDCPOSManager.tracer.WriteLine(string.Format("AddAssignGradeParsEnd end: return result={0}", result));
            return result;
        }

        public int AddTank(int id)
        {
            int result = (int)ErrorCode.ERRCD_OK;
            //FDCPOSManager.tracer.WriteLine("init");
            if (OnAddTank != null)
            {
                result = OnAddTank(id);
            }
            else
                result = (int)ErrorCode.ERRCD_CTRLERR;
            //FDCPOSManager.tracer.WriteLine(string.Format("AddTank end: return result={0}", result));
            return result;
        }

        public int AddTanksEnd()
        {
            int result = (int)ErrorCode.ERRCD_OK;
            //FDCPOSManager.tracer.WriteLine("init");
            if (OnAddTanksEnd != null)
            {
                result = OnAddTanksEnd();
            }
            else
                result = (int)ErrorCode.ERRCD_CTRLERR;
            //FDCPOSManager.tracer.WriteLine(string.Format("AddTanksEnd end: return result={0}", result));
            return result;
        }

        public int AddFuelMode(int id, string name, int authType, int maxAuthTime, int nozzleLayDownTime, int minGuardTime, int paymentType, double minVolume, double minMoney, int SupTransBufSize)
        {
            int result = (int)ErrorCode.ERRCD_OK;
            //FDCPOSManager.tracer.WriteLine("init");
            if (OnAddFuelMode != null)
            {
                result = OnAddFuelMode(id, name, authType, maxAuthTime, nozzleLayDownTime, minGuardTime, paymentType, minVolume, minMoney, SupTransBufSize);
            }
            else
                result = (int)ErrorCode.ERRCD_CTRLERR;
            //FDCPOSManager.tracer.WriteLine(string.Format("AddFuelMode end: return result={0}", result));
            return result;
        }

        public int AddFuelModeEnd()
        {
            int result = (int)ErrorCode.ERRCD_OK;
            //FDCPOSManager.tracer.WriteLine("init");
            if (OnAddFuelModeEnd != null)
            {
                result = OnAddFuelModeEnd();
            }
            else
                result = (int)ErrorCode.ERRCD_CTRLERR;
            //FDCPOSManager.tracer.WriteLine(string.Format("AddFuelModeEnd end: return result={0}", result));
            return result;
        }

        public int SetFuellingModes(int fuellingType, double maxVolume, double maxMoney, int maxFuellingTime, int maxTimeNoProgress, int maxTimeToMinLimit, int presetOverrunLimit)
        {
            int result = (int)ErrorCode.ERRCD_OK;
            //FDCPOSManager.tracer.WriteLine("init");
            if (OnSetFuellingModes != null)
            {
                result = OnSetFuellingModes(fuellingType, maxVolume, maxMoney, maxFuellingTime, maxTimeNoProgress, maxTimeToMinLimit, presetOverrunLimit);
            }
            else
                result = (int)ErrorCode.ERRCD_CTRLERR;
            //FDCPOSManager.tracer.WriteLine(string.Format("SetFuellingModes end: return result={0}", result));
            return result;
        }

        public int AddFuelPoint(int id, int pumpType, int comChannelId, string IPAddress, int IPPort, int physicalAddress, int internalAddress)
        {
            int result = (int)ErrorCode.ERRCD_OK;
            //FDCPOSManager.tracer.WriteLine("init");
            if (OnAddFuelPoint != null)
            {
                result = OnAddFuelPoint(id, pumpType, comChannelId, IPAddress, IPPort, physicalAddress, internalAddress);
            }
            else
                result = (int)ErrorCode.ERRCD_CTRLERR;
            //FDCPOSManager.tracer.WriteLine(string.Format("AddFuelPoint end: return result={0}", result));
            return result;
        }

        public int AddNozzle(int pumpId, int nozzleId)
        {
            int result = (int)ErrorCode.ERRCD_OK;
            //FDCPOSManager.tracer.WriteLine("init");
            if (OnAddNozzle != null)
            {
                result = OnAddNozzle(pumpId, nozzleId);
            }
            else
                result = (int)ErrorCode.ERRCD_CTRLERR;
            //FDCPOSManager.tracer.WriteLine(string.Format("AddNozzle end: return result={0}", result));
            return result;
        }

        public int AddFuelPointsEnd()
        {
            int result = (int)ErrorCode.ERRCD_OK;
            //FDCPOSManager.tracer.WriteLine("init");
            if (OnAddFuelPointsEnd != null)
            {
                result = OnAddFuelPointsEnd();
            }
            else
                result = (int)ErrorCode.ERRCD_CTRLERR;
            //FDCPOSManager.tracer.WriteLine(string.Format("AddFuelPointsEnd end: return result={0}", result));
            return result;
        }

        public int AssignGrade(int pumpId, int nozzleId, int gradeId)
        {
            int result = (int)ErrorCode.ERRCD_OK;
            //FDCPOSManager.tracer.WriteLine("init");
            if (OnAssignGrade != null)
            {
                result = OnAssignGrade(pumpId, nozzleId, gradeId);
            }
            else
                result = (int)ErrorCode.ERRCD_CTRLERR;
            //FDCPOSManager.tracer.WriteLine(string.Format("AssignGrade end: return result={0}", result));
            return result;
        }

        public int AssignGradesEnd()
        {
            int result = (int)ErrorCode.ERRCD_OK;
            //FDCPOSManager.tracer.WriteLine("init");
            if (OnAssignGradesEnd != null)
            {
                result = OnAssignGradesEnd();
            }
            else
                result = (int)ErrorCode.ERRCD_CTRLERR;
            //FDCPOSManager.tracer.WriteLine(string.Format("AssignGradesEnd end: return result={0}", result));
            return result;
        }

        public int AssignMeter(int pumpId, int gradeId, int meterId, int part)
        {
            int result = (int)ErrorCode.ERRCD_OK;
            //FDCPOSManager.tracer.WriteLine("init");
            if (OnAssignMeter != null)
            {
                result = OnAssignMeter(pumpId, gradeId, meterId, part);
            }
            else
                result = (int)ErrorCode.ERRCD_CTRLERR;
            //FDCPOSManager.tracer.WriteLine(string.Format("AssignMeter end: return result={0}", result));
            return result;
        }

        public int AssignMetersEnd()
        {
            int result = (int)ErrorCode.ERRCD_OK;
            //FDCPOSManager.tracer.WriteLine("init");
            if (OnAssignMetersEnd != null)
            {
                result = OnAssignMetersEnd();
            }
            else
                result = (int)ErrorCode.ERRCD_CTRLERR;
            //FDCPOSManager.tracer.WriteLine(string.Format("AssignMetersEnd end: return result={0}", result));
            return result;
        }

        public int AssignTank(int pumpId, int meterId, int tankId)
        {
            int result = (int)ErrorCode.ERRCD_OK;
            //FDCPOSManager.tracer.WriteLine("init");
            if (OnAssignTank != null)
            {
                result = OnAssignTank(pumpId, meterId, tankId);
            }
            else
                result = (int)ErrorCode.ERRCD_CTRLERR;
            //FDCPOSManager.tracer.WriteLine(string.Format("AssignTank end: return result={0}", result));
            return result;
        }

        public int AssignTanksEnd()
        {
            int result = (int)ErrorCode.ERRCD_OK;
            //FDCPOSManager.tracer.WriteLine("init");
            if (OnAssignTanksEnd != null)
            {
                result = OnAssignTanksEnd();
            }
            else
                result = (int)ErrorCode.ERRCD_CTRLERR;
            //FDCPOSManager.tracer.WriteLine(string.Format("AssignTanksEnd end: return result={0}", result));
            return result;
        }

        public int AddPricePole(int id, int type, int physicalAddress, int COMPort)
        {
            int result = (int)ErrorCode.ERRCD_OK;
            //FDCPOSManager.tracer.WriteLine("AddPricePole init");
            if (OnAddPricePole != null)
            {
                result = OnAddPricePole(id, type, physicalAddress, COMPort);
            }
            else
                result = (int)ErrorCode.ERRCD_CTRLERR;
            //FDCPOSManager.tracer.WriteLine(string.Format("AddPricePole end: return result={0}", result));
            return result;
        }
        public int AddPricePoleRow(int id, int gradeId, int fuelMode, int position)
        {
            int result = (int)ErrorCode.ERRCD_OK;
            //FDCPOSManager.tracer.WriteLine("AddPricePoleRow init");
            if (OnAddPricePoleRow != null)
            {
                result = OnAddPricePoleRow(id, gradeId, fuelMode, position);
            }
            else
                result = (int)ErrorCode.ERRCD_CTRLERR;
            //FDCPOSManager.tracer.WriteLine(string.Format("AddPricePoleRow end: return result={0}", result));
            return result;
        }
        public int AddPricePoleEnd()
        {
            int result = (int)ErrorCode.ERRCD_OK;
            //FDCPOSManager.tracer.WriteLine("AddPricePoleEnd init");
            if (OnAddPricePoleEnd != null)
            {
                result = OnAddPricePoleEnd();
            }
            else
                result = (int)ErrorCode.ERRCD_CTRLERR;
            //FDCPOSManager.tracer.WriteLine(string.Format("AddPricePoleEnd end: return result={0}", result));
            return result;
        }

        public int LoadPriceset(int id, int gradeId, double price)
        {
            int result = (int)ErrorCode.ERRCD_OK;
            //FDCPOSManager.tracer.WriteLine("init");
            if (OnLoadPriceset != null)
            {
                result = OnLoadPriceset(id, gradeId, price);
            }
            else
                result = (int)ErrorCode.ERRCD_CTRLERR;
            //FDCPOSManager.tracer.WriteLine(string.Format("LoadPriceset end: return result={0}", result));
            return result;
        }

        public int LoadPricesetEnd()
        {
            int result = (int)ErrorCode.ERRCD_OK;
            //FDCPOSManager.tracer.WriteLine("init");
            if (OnLoadPricesetEnd != null)
            {
                result = OnLoadPricesetEnd();
            }
            else
                result = (int)ErrorCode.ERRCD_CTRLERR;
            //FDCPOSManager.tracer.WriteLine(string.Format("LoadPricesetEnd end: return result={0}", result));
            return result;
        }


        #endregion
    }
}