using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Timers;

namespace SinoChemFC2PosProxy
{
    public class LogPurge
    {
        private System.Timers.Timer scannerTimer;
        private int purgeLogFilesWhenOldThanDays = -1;
        string[] searchFolders = new[]
        {
            //Proxy_Main_20150831.txt
            @"c:\Wayne\Log\SinoChemFC2PosProxy\",
            //SSF.FC.20150826.132125928.LOG.gz
            @"c:\Program Files\Fusion\Bin\SSF.Logs\SSF.FC.Logs\Backup\",
            //SSF.ROUTER.20150826.094252740.LOG.gz
            @"c:\Program Files\Fusion\Bin\SSF.Logs\SSF.Router.Logs\Backup\",
        };
        public void Start()
        {
            this.purgeLogFilesWhenOldThanDays = int.Parse(ConfigurationManager.AppSettings["purgeLogFilesWhenOldThanDays"]);
            // every 1 days, do a log purge.
            this.scannerTimer = new System.Timers.Timer(1000 * 60);// * 60 * 24);
            this.scannerTimer.Elapsed += scannerTimer_Elapsed;
            this.scannerTimer.Start();
        }

        void scannerTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            foreach (var dirPath in searchFolders)
            {
                var dirInfo = new DirectoryInfo(dirPath);
                if (!dirInfo.Exists) continue;
                foreach (var logFileInfo in dirInfo.GetFiles())
                {
                    if (isFilePendingForPurge(logFileInfo))
                    {
                        logFileInfo.Delete();
                    }
                }
            }
        }

        private bool isFilePendingForPurge(FileInfo fileInfo)
        {
            Regex r = new Regex(@"20\d\d\d\d\d\d\.");
            var dateInFileName = r.Match(fileInfo.Name);
            if (dateInFileName.Success)
            {
                var dateString = dateInFileName.Value.Substring(0, dateInFileName.Value.Length - 1);
                dateString = dateString.Substring(0, 4) + "-" + dateString.Substring(4, 2) + "-" +
                             dateString.Substring(6, 2);
                DateTime convertedDateTime;
                try
                {
                    convertedDateTime = DateTime.Parse(dateString);
                }
                catch (Exception exx)
                { return false; }
                var timeDiff = DateTime.Now - convertedDateTime;
                if (timeDiff.TotalDays >= this.purgeLogFilesWhenOldThanDays)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }

            return false;
        }
    }
}