using FCOMMON;
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 FPJ0000.OtConfirm
{
    public partial class fHolyRequestAdd : fBase
    {
        DSKuntae.EETGW_HolydayRequestRow dr;
        Boolean binit = false;
        public fHolyRequestAdd(DSKuntae.EETGW_HolydayRequestRow dr_)
        {
            InitializeComponent();
            dr = dr_;


            var 구분목록 = FCOMMON.DBM.getCodeList("50");
            var 사유목록 = FCOMMON.DBM.getCodeList("51");
            var 위치목록 = FCOMMON.DBM.getCodeList("52");
            var 백업목록 = FCOMMON.DBM.getCodeList("53");

            tbCate.Items.Clear();
            tbReason.Items.Clear();
            tbLocation.Items.Clear();
            tbBackup.Items.Clear();

            foreach (var item in 구분목록) tbCate.Items.Add(item.Value);
            foreach (var item in 사유목록) tbReason.Items.Add(item.Value);
            foreach (var item in 위치목록) tbLocation.Items.Add(item.Value);
            foreach (var item in 백업목록) tbBackup.Items.Add(item.Value);


            var userlist = FCOMMON.DBM.getActiveUserTable();
            this.cmbUser.DataSource = userlist;
            this.cmbUser.ValueMember = "id";
            this.cmbUser.DisplayMember = "dispname";

            if (dr.IsstimeNull() == false)
                this.textBox1.Text = dr.stime;
            else
                this.textBox1.Text = "00:00";

            if (dr.IsetimeNull() == false)
                this.textBox2.Text = dr.etime;
            else
                this.textBox2.Text = "00:00";

            if (dr.RowState == DataRowState.Detached)
            {
                this.Text = "(휴가/외출)신청 추가";
                cmbUser.Text = $"{FCOMMON.info.Login.nameK}({FCOMMON.info.Login.no})";
                //tbProcess.Text = FCOMMON.info.Login.process;
                //tbTel.Text = FCOMMON.info.Login.tel;
            }
            else
            {

                this.Text = "(휴가/외출) 편집";
                cmbUser.Text = $"{dr.name}({dr.uid})"; //dr.name;
                                                       ////.Text = dr.processs;
                                                       // tbTel.Text = dr.tel;
            }

            if (dr.conf == 1) rad1.Checked = true;
            else if (dr.conf == 2) rad2.Checked = true;
            else rad0.Checked = true;

            tbCate.Text = dr.cate;
            tbRemark.Text = dr.Remark;
            tbResponse.Text = dr.Response;
            tbSD.Value = DateTime.Parse(dr.sdate);
            tbED.Value = DateTime.Parse(dr.edate);
            tbReason.Text = dr.HolyReason;
            tbLocation.Text = dr.HolyLocation;
            tbBackup.Text = dr.HolyBackup;
            tbDays.Text = dr.HolyDays.ToString();   //211224
            tbTimes.Text = dr.HolyTimes.ToString();

            if (dr.cate == "대체")
            {
                tbTimes.Enabled = true;
                tbDays.Enabled = false;
                tbCate.Enabled = false;
                radTime.Checked = true;
            }
            else if (dr.cate == "외출")
            {
                radOut.Checked = true;
            }
            else
            {
                tbCate.Enabled = true;
                tbTimes.Enabled = false;
                tbDays.Enabled = true;
                radDay.Checked = true;
            }
            this.KeyDown += (s1, e1) =>
            {
                if (e1.KeyCode == Keys.Escape) this.Close();
            };

        }
        int curLevel = 0;

        public bool IsAdmin { get { return curLevel >= 5; } }
        private void fHolyRequestAdd_Load(object sender, EventArgs e)
        {
            EnsureVisibleAndUsableSize();
            curLevel = Math.Max(FCOMMON.info.Login.level, FCOMMON.DBM.getAuth(FCOMMON.DBM.eAuthType.holyreq));


            //관리자라면 관리자패널을 활성해준다.
            if (dr.RowState == DataRowState.Detached)
            {
                cmbUser.Enabled = IsAdmin;// curLevel >= 5;
                grpAdmin.Enabled = false;
                grpAdmin.Text = "관리자(추가작업시에는 사용할 수 없습니다)";
                UpdateStatus();
                button1.Enabled = true;
            }
            else
            {
                cmbUser.Enabled = false;
                grpAdmin.Enabled = IsAdmin;// curLevel >= 5;
                if (IsAdmin)
                {
                    grpUser.Text = "신청자(편집상태에서는 사용자를 변경할 수 없습니다)";
                    button1.Enabled = true;

                }
                else
                {
                    //관리자 승인된 자료는 업데이트하지 ㅇ낳는다.
                    if (dr.IsconfNull() || dr.conf == 0)
                    {
                        button1.Enabled = true;
                    }
                    else
                    {
                        //승인혹은 취소됨
                        FCOMMON.Util.MsgI("관리자 승인/취소된 자료는 편집할 수 없습니다");
                        button1.Enabled = false;
                    }
                }
                var 관리자사전멘트 = FCOMMON.DBM.getCodeList("54");
                cmbPreset.Items.Clear();
                cmbPreset.Items.Add(" -- 저장된 문구를 선택하세요(공용:54) --");
                cmbPreset.Items.AddRange(관리자사전멘트.Select(t => t.Value).ToArray());
                cmbPreset.SelectedIndex = 0;
            }

            if (IsAdmin)
            {
                tbCate.DropDownStyle = ComboBoxStyle.DropDown;
            }
            else
            {
                tbCate.DropDownStyle = ComboBoxStyle.DropDownList;
            }



            binit = true;

            cmbUser_SelectedIndexChanged(null, null);
            radioButton1_CheckedChanged(null, null);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var cate = tbCate.Text.Trim();
            if (radTime.Checked) cate = "대체";
            else if (radOut.Checked) cate = "외출";

            var remark = tbRemark.Text.Trim();
            var response = tbResponse.Text.Trim();
            if (string.IsNullOrEmpty(cate))
            {
                FCOMMON.Util.MsgE("구분을 입력하세요");
                tbCate.Focus();
                return;
            }

            //일반사용인데 내용이 대체 라는 문자라면 오류로 한다  220627
            if (radTime.Checked == false && cate.Equals("대체"))
            {
                FCOMMON.Util.MsgE("일반 휴가 사용에 '대체' 문자는 입력할 수 없습니다\n대체 시간을 사용하는 경우 라면 '대체시간사용'을 입력하세요");
                tbCate.Focus();
                return;
            }

        
            var vDay = 0f;
            var vTime = 0f;

            if (tbDays.Enabled == false) tbDays.Text = string.Empty;
            if (tbTimes.Enabled == false) tbTimes.Text = string.Empty;

            if (double.TryParse(tbDays.Text, out double val_days)) vDay = float.Parse(tbDays.Text.Trim());
            if (double.TryParse(tbTimes.Text, out double val_times)) vTime = float.Parse(tbTimes.Text.Trim());


            //라디오버튼에 따른 시간 값 할당
            if (radTime.Checked) vDay = 0;
            else vTime = 0;

            if (radOut.Checked == false)
            {
                if (tbED.Value.ToString("yyyy-MM-dd").CompareTo(tbSD.Value.ToString("yyyy-MM-dd")) < 0)
                {
                    FCOMMON.Util.MsgE("시작일~종료일 범위를 확인하세요");
                    return;
                }

                if (vDay > 0 && vTime > 0)
                {
                    FCOMMON.Util.MsgE("사용일/시간을 동시에 입력할 수는 없습니다.\r\n" +
                       "대체휴가의 경우에만 시간을 입력하시기 바랍니다");
                    return;
                }

                if (vDay < 0.1 && vTime < 0.1 )
                {
                    if (curLevel < 5)
                    {
                        var dlg = FCOMMON.Util.MsgQ("사용 일/시간 값을 입력해주세요\n대체휴가에는 시간을 입력하세요\n값을 입력하지 않고 계속할까요?");
                        if (dlg != DialogResult.Yes) return;
                    }
                    else if (AR.UTIL.MsgQ("휴가 일(시간) 값이 입력되지 않았습니다\n입력할까요?") == DialogResult.No) return;
                }
            }
            else
            {
                if (textBox1.Text.IndexOf(":") == -1 || textBox1.Text.Equals("00:00"))
                {
                    FCOMMON.Util.MsgE("외출 시작시간은  00:00 24시 표기법으로 입력하세요\n" +
                    "예) 오후2시  =   14:00");
                    textBox1.Focus();
                    textBox1.SelectAll();
                    return;
                }

                //추가시에는 종료시간을 입력하지 않게한다.
                if (dr.RowState == DataRowState.Detached)
                {
                    if (textBox2.Text.IndexOf(":") == -1 || textBox2.Text.Equals("00:00"))
                    {

                    }
                    else
                    {
                        textBox2.Text = "00:00";
                        FCOMMON.Util.MsgI("신청데이터에는 외출종료시간을 입력하지 않습니다\n외출종료 화면에서 시간을 입력하세요");
                    }
                }

                //if (textBox2.Text.IndexOf(":") == -1 || textBox2.Text.Equals("00:00"))
                //{
                //    FCOMMON.Util.MsgE("외출 종료시간은  00:00 24시 표기법으로 입력하세요\n" +
                //    "예) 오후2시  =   14:00");
                //    textBox2.Focus();
                //    textBox2.SelectAll();
                //    return;
                //}
                //

                if (tbSD.Value.ToString("yyyy-MM-dd").Equals(tbED.Value.ToString("yyyy-MM-dd")) == false)
                {
                    FCOMMON.Util.MsgE("외출은 시작일 종료일이 같아야 합니다, 종료일자를 시작일자로 자동 변경 합니다");
                    tbED.Value = tbSD.Value;
                    return;
                }

                if (textBox2.Text.Equals("00:00") == false)
                {
                    var st = DateTime.Parse(tbSD.Value.ToString("yyyy-MM-dd") + " " + textBox1.Text + ":00");
                    var et = DateTime.Parse(tbED.Value.ToString("yyyy-MM-dd") + " " + textBox2.Text + ":00");
                    if (et <= st)
                    {
                        FCOMMON.Util.MsgE("외출 시간을 확인하세요.\n종료시간은 시작시간보다 커야 합니다");
                        return;
                    }
                }
            }

            var uid = this.cmbUser.SelectedValue;
            if (uid == null)
            {
                FCOMMON.Util.MsgE("사용자가 선택되지 않았습니다");
                return;
            }

            //사용시간여부 확인
            if (radOut.Checked == false)
            {
                var minmsg = "해당 항목 [{0}]의 신청 가능 일(시간)이 없습니다\n\n남은 일(시간) : {1} \n\n관리자 문의 하세요";
                if (IsAdmin)
                    minmsg = "해당 항목 [{0}]의 신청 가능 일(시간)이 없습니다\n\n남은 일(시간) : {1} \n\n관리자 권한으로 기록은 진행 됩니다";

                bool oktime = false;
                if (radTime.Checked)    //대체사용
                {
                    minmsg = minmsg.Replace("{0}", "대체");
                    if (holydata.ContainsKey("대체"))
                    {
                        var data = holydata["대체"].Split('|');
                        var 발생 = float.Parse(data[3]);
                        var 사용 = float.Parse(data[4]);
                        var 잔량 = float.Parse(data[5]);
                        if (vTime <= 잔량) oktime = true;
                        else minmsg = minmsg.Replace("{1}", 잔량.ToString());
                    }
                    else minmsg = minmsg.Replace("{1}", "(자료없음)");
                }
                else
                {
                    var 항목 = tbCate.Text;
                    minmsg = minmsg.Replace("{0}", 항목);
                    if (holydata.ContainsKey(항목))
                    {
                        var data = holydata[항목].Split('|');
                        var 발생 = float.Parse(data[0]);
                        var 사용 = float.Parse(data[1]);
                        var 잔량 = float.Parse(data[2]);
                        if (vDay <= 잔량) oktime = true;
                        else minmsg = minmsg.Replace("{1}", 잔량.ToString());
                    }
                    else minmsg = minmsg.Replace("{1}", "(자료없음)");
                }
                if (oktime == false)
                {
                    //FCOMMON.Util.MsgE(minmsg);
                    //if (IsAdmin == false) return;
                }

            }

            //   return;

            //하나도 입력안했다면 경고한다
            if (String.IsNullOrEmpty(tbReason.Text) && String.IsNullOrEmpty(tbLocation.Text) && String.IsNullOrEmpty(tbBackup.Text) && String.IsNullOrEmpty(tbRemark.Text))
            {
                FCOMMON.Util.MsgE("비고를 입력해주세요");
                tbRemark.Focus();
                return;
            }

            if (tbRemark.Text.StartsWith("테스트") && chkSendMail.Checked)
            {
                FCOMMON.Util.MsgI("테스트라 메일 체크를 끕니다");
                chkSendMail.Checked = false;
            }

            //동일날짜에 등록된 자료가있다면 오류로 처리한다.
            if (dr.RowState == DataRowState.Detached)
            {

                var db = new dsPRJTableAdapters.QueriesTableAdapter();
                string chkdt = tbSD.Value.ToString("yyyy-MM-dd");
                var existdb = db.ExistHolydayRequest(FCOMMON.info.Login.gcode, cate, uid.ToString(), chkdt) > 0;// db.EETGW_HolydayRequest.Where(t => t.gcode == FCOMMON.info.Login.gcode && t.cate == cate && t.uid == uid.ToString() && t.sdate == chkdt).Any();
                if (existdb)
                {
                    FCOMMON.Util.MsgE("동일 날짜에 등록된 자료가 있습니다");
                    return;
                }

            }


            //마감확인  220501
            if (FCOMMON.DBM.GetMagamStatus(tbSD.Value))
            {
                FCOMMON.Util.MsgE("마감된 월 입니다. 입력할 수 없습니다");
                return;
            }
            if (FCOMMON.DBM.GetMagamStatus(tbED.Value))
            {
                FCOMMON.Util.MsgE("마감된 월 입니다. 입력할 수 없습니다");
                return;
            }

            if (dr.RowState == DataRowState.Detached)
            {
                var dlg = FCOMMON.Util.MsgQ("입력을 완료하시겠습니까?\r\n관리자에게 메일로 알림이 발생 합니다");
                if (dlg != DialogResult.Yes) return;
            }

            if (curLevel >= 5 && rad2.Checked)
            {
                if (string.IsNullOrEmpty(response))
                {
                    FCOMMON.Util.MsgE("거절 사유를 입력 해주세요");
                    tbResponse.Focus();
                    return;
                }
            }

            dr.uid = uid.ToString();
            dr.HolyReason = tbReason.Text.Trim();
            dr.HolyLocation = tbLocation.Text.Trim();
            dr.HolyBackup = tbBackup.Text.Trim();
            dr.cate = cate;// tbCate.Text.Trim();

            if (dr.RowState == DataRowState.Detached && dr.Remark.Contains(richTextBox1.Text) == false)
                dr.Remark = tbRemark.Text.Trim() + "\r\n" + this.richTextBox1.Text;
            else
                dr.Remark = tbRemark.Text.Trim();

            dr.Response = tbResponse.Text.Trim();

            dr.sdate = tbSD.Value.ToString("yyyy-MM-dd");
            dr.edate = tbED.Value.ToString("yyyy-MM-dd");
            dr.sendmail = chkSendMail.Checked; //220104

            if (textBox1.Text.isEmpty() == false && textBox1.Text.Equals("00:00") == false)
                dr.stime = textBox1.Text.Trim();
            if (textBox2.Text.isEmpty() == false && textBox2.Text.Equals("00:00") == false)
                dr.etime = textBox2.Text.Trim();

            dr.HolyDays = vDay;
            dr.HolyTimes = vTime;//

            if (rad0.Checked) dr.conf = 0;
            else if (rad1.Checked) dr.conf = 1;
            else if (rad2.Checked) dr.conf = 2;
            else dr.conf = 0;

            if (rad1.Checked || rad2.Checked)
            {
                dr.conf_id = FCOMMON.info.Login.no;
                dr.conf_time = DateTime.Now;
            }
            else
            {
                dr.Setconf_idNull();
                dr.Setconf_timeNull();
            }

            dr.EndEdit();

            DialogResult = DialogResult.OK;
        }

        private void cmbPreset_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmbPreset.SelectedIndex > 0)
                tbResponse.Text = cmbPreset.Text;
        }

        private void tbED_ValueChanged(object sender, EventArgs e)
        {
            UpdateStatus();

        }

        void UpdateStatus()
        {
            //해당 값이 오늘보다 이전이라면 메일전송을 자동 해제하낟.
            var v = tbED.Value.ToString("yyyy-MM-dd");
            var s = tbSD.Value.ToString("yyyy-MM-dd");

            var c = DateTime.Now.ToString("yyyy-MM-dd");
            if (v.CompareTo(c) < 0)
                chkSendMail.Checked = false;
            else
                chkSendMail.Checked = true;

            //일수계산
            //var term = tbED.Value - tbSD.Value;
            //var days = term.Days + 1;
            //if (radTime.Checked == false)
            //{
            //    //if(tbDays.Text.isEmpty() || tbDays.Text=="0")
            //    {
            //        tbDays.Text = (days).ToString();
            //    }

            //}
            //else
            //{
            //    //여기는 시간
            //    //if (tbTimes.Text.isEmpty() || tbTimes.Text == "0")
            //    {
            //        tbTimes.Text = (days * 8).ToString();
            //    }
            //}
        }

        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            if (radTime.Checked)
            {
                tbCate.Enabled = false;
                tbDays.Enabled = false;
                tbTimes.Enabled = true;
                tbDays.BackColor = Color.DimGray;
                tbTimes.BackColor = Color.Gold;
                groupBox1.Text = "사용시간";
                radTime.BackColor = Color.Lime;
                radDay.BackColor = SystemColors.Control;
                radOut.BackColor = SystemColors.Control;
                groupBox1.Enabled = true;
                textBox1.Enabled = false;
            }
            else if (radDay.Checked)
            {
                tbCate.Enabled = true;
                tbDays.Enabled = true;
                tbTimes.Enabled = false;
                tbTimes.BackColor = Color.DimGray;
                tbDays.BackColor = Color.Gold;
                groupBox1.Text = "사용일";
                radDay.BackColor = Color.Lime;
                radTime.BackColor = SystemColors.Control;
                radOut.BackColor = SystemColors.Control;
                groupBox1.Enabled = true;
                textBox1.Enabled = false;

            }
            else if (radOut.Checked)
            {
                radOut.BackColor = Color.Lime;
                radTime.BackColor = SystemColors.Control;
                radDay.BackColor = SystemColors.Control;
                textBox1.Enabled = radOut.Checked;
                if (dr.RowState == DataRowState.Detached) textBox2.Enabled = false;
                else textBox2.Enabled = true;
                groupBox1.Enabled = !textBox1.Enabled;
            }
            textBox2.Enabled = textBox1.Enabled;
            if (binit)
                UpdateStatus();
        }


        Dictionary<string, string> holydata = new Dictionary<string, string>();

        string updateuserinfo = string.Empty;
        string updateuserdate = string.Empty;
        private void cmbUser_SelectedIndexChanged(object sender, EventArgs e)
        {
            var uiddt = this.cmbUser.SelectedValue;
            if (uiddt == null) return;
            var uid = uiddt.ToString();
            if (uid.isEmpty()) return;
            if (uid == "System.Data.DataRowView") return;
            if (updateuserinfo.Equals(uid)) return;

            UpdateMessage();
        }
        void UpdateMessage()
        {
            var uiddt = this.cmbUser.SelectedValue;
            if (uiddt == null) return;
            var uid = uiddt.ToString();
            if (uid.isEmpty()) return;
            if (uid == "System.Data.DataRowView") return;
            

            var basedate = tbSD.Value.AddDays(-1).ToString("yyyy-MM-dd");

            if (updateuserinfo.Equals(uid) && updateuserdate.Equals(basedate)) return;


            holydata = FCOMMON.DBM.GetUserHolidayJan(FCOMMON.info.Login.gcode, uid, basedate);

            this.richTextBox1.Clear();
            richTextBox1.AppendText($"[기준:{basedate}] => ");
            if(holydata.Any()==false) richTextBox1.Text += "등록된 근태자료가 없습니다";
            foreach (var item in holydata)
            {
                var val = item.Value.Split('|');
                if (val[0] != "0" || val[2] != "0")
                {
                    var perc = 0f;
                    if (val[0] != "0") perc = float.Parse(val[1]) / float.Parse(val[0]);
                    if (richTextBox1.TextLength > 0) richTextBox1.AppendText(",");
                    richTextBox1.AppendText($"[{item.Key}] {val[2]:N1}일 남음({perc * 100:N1}%사용)");
                }
                else if (val[3] != "0" || val[5] != "0")
                {
                    var perc = 0f;
                    if (val[3] != "0") perc = float.Parse(val[4]) / float.Parse(val[3]);
                    if (richTextBox1.TextLength > 0) richTextBox1.AppendText(",");
                    richTextBox1.AppendText($"[{item.Key}] {val[5]:N1}시간 남음({perc * 100:N1}%사용)");
                }

            }
            if (holydata.Any())
            {
                updateuserinfo = uid; //업데이트한 사용자 id 기록
                updateuserdate = basedate;
            }

                
        }

        private void radioButton1_CheckedChanged_1(object sender, EventArgs e)
        {

        }

        private void tbTimes_TextChanged(object sender, EventArgs e)
        {

        }

        private void tbSD_ValueChanged(object sender, EventArgs e)
        {
            UpdateMessage();
            //if(tbED.Value < tbSD.Value)
            //{
            //    FCOMMON.Util.MsgE("종료일자를 시작일자로 변경합니다");
            //    tbED.Value = tbSD.Value;
            //}
        }
    }
}
