using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using QMAPP.FJC.Entity.EnergyManage;

namespace MeterReadingService
{
    public partial class MeterReadingService : ServiceBase
    {
        System.Threading.Timer readtimer;

        int _Period = 60000;

        List<Meter> _MeterList = new List<Meter>();

        MeterReader.ElectricMeterReader reader = new MeterReader.ElectricMeterReader();

        public MeterReadingService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            QMAPP.FJC.BLL.EnergyManage.MeterBLL meterbll = new QMAPP.FJC.BLL.EnergyManage.MeterBLL();
            _MeterList = meterbll.GetList(new Meter { });

            string setperiod = System.Configuration.ConfigurationManager.AppSettings["ReadPeriod"];
            if (!int.TryParse(setperiod, out _Period))
            {
                _Period = 60000;
            }
            if (readtimer == null)
            {
                readtimer = new System.Threading.Timer(new System.Threading.TimerCallback(readertimer_tick));
                
            }
            readtimer.Change(0, _Period);
        }

        protected override void OnStop()
        {
            if (readtimer != null)
            {
                readtimer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite);
                readtimer.Dispose();
            }
            _MeterList.Clear();
        }

        private void readertimer_tick(object obj)
        {
            QMAPP.FJC.BLL.EnergyManage.MeterReadingsBLL mrbll = new QMAPP.FJC.BLL.EnergyManage.MeterReadingsBLL();
            foreach (var meter in _MeterList)
            {
                var lastreading=mrbll.GetLastReading(meter.METER_CODE);
                var read = reader.Read(meter);
                MeterReadings newreading = new MeterReadings
                {
                    DIFF_WITH_LAST = lastreading == null ? 0 : (decimal)read - lastreading.READING,
                    ERROR = "",
                    METER_PID = meter.PID,
                    READING = (decimal)read,
                    PID = Guid.NewGuid().ToString(),
                    READ_RESULT = read > 0 ? "1" : "0",
                    READ_TIME = DateTime.Now
                };
                mrbll.Insert(newreading);
            }
        }
    }
}