using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace JobReportMailService
{
    public partial class fSendMail : fChildBase
    {

        public fSendMail()
        {
            InitializeComponent();
        }

        private void fJobReportDay_Load(object sender, EventArgs e)
        {
            this.Delaytime = 3000;
            task = Task.Run(() =>
            {
                while (taskrun)
                {
                    if (taskwait)
                    {
                        task.Wait(1000);
                        continue;
                    }

                    var ts = DateTime.Now - LastUpdateTime;
                    if (ts.TotalMilliseconds <= 1000)
                    {
                        continue;
                    }
                    else
                    {
                        LastUpdateTime = DateTime.Now;
                        try
                        {
                            RunData();
                        }
                        catch (Exception ex)
                        {
                            addmsg(ex.Message);
                            task.Wait(5000);
                        }
                    }
                    Task.Delay(Delaytime).Wait();
                }

            });
            timer1.Start();
        }

        void RunData()
        {
            SendMail();
            System.Threading.Thread.Sleep(1000);
            MakeAutoMail();
        }

        void SendMail()
        {
            
            var ta = new DataSet1TableAdapters.MailDataTableAdapter();
            var sendList = ta.GetData(); //발송되지않은 메일목록

            if (sendList.Rows.Count > 0) addmsg("Found : " + sendList.Rows.Count.ToString());
            else addmsg("전송할 메일이 없습니다");

            foreach (DataSet1.MailDataRow dr in sendList)
            {
                //전자메일 검증을 한다.
                var list_from = getMaillist(dr.fromlist);
                var list_to = getMaillist(dr.tolist);
                var list_bcc = getMaillist(dr.bcc);
                var list_cc = getMaillist(dr.cc);

                string sendMsg = "";
                if (list_from == "")
                {
                    sendMsg = ("보내는 주소가 없습니다");
                }
                else if (dr.subject.Trim() == "")
                {
                    sendMsg = ("메일 제목이 없습니다");
                }
                else if (dr.body.Trim() == "")
                {
                    sendMsg = ("본문이 없습니다");
                }
                else if (list_to == "")
                {
                    sendMsg = ("받는 주소가 없습니다");
                }
                else
                {

                    var body = dr.body;
                    body +=
                        "<p>" +
                        "<br />이 메일은 EET 프로그램에서 자동 발신 되었습니다." +
                        "<br />메일이 잘못 전송 되었다면 [<a href='chikyun.kim@amkor.co.kr'>chikyun.kim@amkor.co.kr</a>] 로 문의 주시기 바랍니다" +
                        "</p>";


                    //전송을 해야 함
                    var mc = new System.Net.Mail.SmtpClient("10.101.10.6");
                    var msg = new System.Net.Mail.MailMessage
                        (list_from,
                        list_to,
                        dr.subject,
                        body);


                    if (list_bcc != "") msg.Bcc.Add(list_bcc);
                    if (list_cc != "") msg.CC.Add(list_cc);
                    msg.IsBodyHtml = true;

                    try
                    {
                        mc.Send(msg);
                        Console.WriteLine("send mail to" + list_to + ",subject=" + dr.subject);
                        sendMsg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    }
                    catch (Exception eX)
                    {
                        sendMsg = eX.Message;
                    }
                }

                Console.WriteLine(string.Format("Send Complete index={0},Msg={1}", dr.idx, sendMsg));
                ta.UpdateSendOK(sendMsg, dr.idx);
                break;
            }

        }
        static DateTime ChkAutoDate = DateTime.Now.AddDays(-1);
        void MakeAutoMail()
        {
            var ts = DateTime.Now - ChkAutoDate;
            if (ts.TotalMinutes < 1) return;   //10분마다 자동 생성 데이터를 처리한다
            Console.WriteLine("Check Auto Make Mail");

            var taData = new DataSet1TableAdapters.MailDataTableAdapter();
            var taList = new DataSet1TableAdapters.MailAutoTableAdapter();
            var dtList = taList.GetByAutoSend();
            var dtInsert = new DataSet1.MailDataDataTable();

            //대상
            Console.WriteLine("Make Auto Send Mail Data (" + dtList.Rows.Count.ToString() + ")");

            foreach (DataSet1.MailAutoRow dr in dtList)
            {
                //시간정보가 없는 애들은 처리 하지 않음
                if (dr.stime.IndexOf(":") == -1) continue;
                if (dr.sday == null || dr.sday.Length < 2) continue;

                //발신시간을 넘어야 한다
                var curTime = DateTime.Now.ToString("HH:mm");
                if (string.Compare(curTime, dr.stime) < 0) continue;   //지정된 시간 이전이면 생성 안한다

                //자동생성 구분용 카테고리
                var cate = string.Format("{0},{1}", dr.sday[0], dr.sday[1]);

                //동륵일
                var pdate = DateTime.Now.ToString("yyyy-MM-dd");

                //같은날, 같은 atime aidx pdate 의 같이 있으면 이미 생성된것이므로 추가하지 않는다
                var existData = taData.FindAutoData(dr.idx, dr.stime, pdate, cate);
                var PreMakeCount = (int)(existData);
                if (PreMakeCount > 0) continue;

                //전송간격과 대상
                if (dr.sday[0] == 1)
                {
                    //week
                    var bitString = Convert.ToString(dr.sday[1], 2).PadLeft(8, '0').ToArray();
                    var weeknum = (int)(DateTime.Now.DayOfWeek);
                    if (bitString[weeknum + 1] == '0') continue;
                }
                else
                {
                    //month
                    if (dr.sday[1] != DateTime.Now.Day) continue;
                }



                //같은날, 같은 atime aidx pdate 의 같이 있으면 이미 생성된것이므로 추가하지 않는다
                //생성해야할 자료라면 만들어 준다
                var newdr = dtInsert.NewMailDataRow();
                newdr.pdate = pdate;// DateTime.Now.ToString("yyyy-MM-dd");
                newdr.gcode = dr.gcode;
                newdr.fromlist = dr.fromlist;
                newdr.tolist = dr.tolist;
                newdr.bcc = dr.bcc;
                newdr.cate = cate;// string.Format("{0},{1}", dr.sday[0], dr.sday[1]);    //cate에 해당 자료를 기록한다.
                newdr.cc = dr.cc;
                newdr.subject = dr.subject;
                newdr.body = dr.body;
                newdr.aidx = dr.idx;
                newdr.atime = dr.stime;
                newdr.wuid = "MANAGER";
                newdr.wdate = DateTime.Now;
                dtInsert.AddMailDataRow(newdr);
                try
                {
                    taData.Update(newdr);
                    Console.WriteLine("auto make : " + newdr.tolist + ",subject=" + newdr.subject);
                }
                catch (Exception eX)
                {
                    Console.WriteLine("auto make error : " + eX.Message);
                }
            }
            ChkAutoDate = DateTime.Now;
        }

        string getMaillist(string org)
        {
            org = org.Replace(";", ",").Replace(":", ",");
            string list_to = "";
            foreach (var item in org.Split(','))
            {
                if (item.Trim() != "")
                {
                    var atindex = item.IndexOf("@");
                    if (atindex != -1)
                    {
                        var dotindex = item.IndexOf(".", atindex + 1);
                        if (dotindex != -1)
                        {
                            //정상이므로 추가한다.
                            if (list_to != "") list_to += ",";
                            list_to += item.Trim();
                        }
                    }
                }
            }
            return list_to;
        }

        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            taskwait = !taskwait;
            if (taskwait == false)
                LastUpdateTime = DateTime.Now.AddHours(-1);
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (task != null)
            {
                if (task.IsCompleted) this.toolStripButton1.Text = "완료";
                else if (task.IsCanceled) this.toolStripButton1.Text = "취소";
                else if (taskwait) this.toolStripButton1.Text = "대기상태";
                else this.toolStripButton1.Text = "가동중";
                this.toolStripButton1.Enabled = true;
            }
            else
            {
                this.toolStripButton1.Text = "사용불가";
                this.toolStripButton1.Enabled = false;
            }

        }
    }
}
