using AR;
using BokBonCheck;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
using UniMarc;
using UniMarc.SearchModel;

namespace UniMarc
{
    public partial class DLS_Copy : Form
    {
        Main main;
        public string compidx;
        string URL = "https://dls1.edunet.net/DLS/bookMng/bookMain";
        public DLS_Copy(Main _main)
        {
            InitializeComponent();
            main = _main;
            compidx = PUB.user.CompanyIdx;

            //https://dls.edunet.net/DLS/totalLoginMain
            //아이디: yudeok5530 비번: YUDEOK6578
            //url = "https://read365.edunet.net/TotalSearch";

            this.FormClosed += DLS_Copy_FormClosed;
            btn_Search.Enabled = false;
        }

        private void DLS_Copy_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (_searcher != null)
            {
                _searcher.StopDriver();
            }
        }

        private void DLS_Copy_Load(object sender, EventArgs e)
        {

            this.Show();
            Application.DoEvents();

            //크롤링 
            InitializeChromeDriver();

        }
        #region 크롤링

        private readonly BookSearchService _searchService;
        private bool _isSearching = false;

        private async void InitializeChromeDriver()
        {
            var lblStatus = this.lblStatus;// (Label)this.Controls["lblStatus"];
            lblStatus.Text = "WebDriver:Chrome 드라이버 확인 중...";
            lblStatus.ForeColor = Color.Blue;

            try
            {
                // Chrome 설치 확인
                if (!SeleniumHelper.IsBrowserInstalled())
                {
                    UTIL.MsgE("Google Chrome / Microsoft Edge 이(가) 설치되어 있지 않습니다. 브라우저를 설치한 후 프로그램을 다시 실행해주세요.");
                    lblStatus.Text = "WebDriver: 브라우저가 설치되지 않음";
                    lblStatus.ForeColor = Color.Red;
                    return;
                }

                //준비된 경우에는 다운로드 하지 않는다.
                if (SeleniumHelper.IsReady)
                {
                    lblStatus.Text = $"WebDriver:Ready({SeleniumHelper.Browser})";
                    lblStatus.ForeColor = Color.Green;
                }
                else
                {
                    // 드라이버가 없거나 작동하지 않으면 다운로드 진행 창 표시
                    using (var progressForm = new DownloadProgressForm())
                    {
                        progressForm.Show();

                        try
                        {
                            // ChromeDriver 설정
                            await SeleniumHelper.Download(progressForm: progressForm);

                            // 드라이버 테스트
                            var isWorking = await SeleniumHelper.TestDriver(progressForm);
                            if (isWorking)
                            {
                                lblStatus.Text = $"WebDriver:Ready({SeleniumHelper.Browser})";
                                lblStatus.ForeColor = Color.Green;
                            }
                            else
                            {
                                lblStatus.Text = "WebDriver:드라이버 테스트 실패";
                                lblStatus.ForeColor = Color.Red;
                                UTIL.MsgE("Chrome 드라이버 테스트에 실패했습니다. 인터넷 연결을 확인하고 프로그램을 다시 실행해주세요.");
                            }
                        }
                        catch (OperationCanceledException)
                        {
                            lblStatus.Text = "WebDriver:드라이버 테스트가 취소되었습니다.";
                            lblStatus.ForeColor = Color.Orange;
                            return;
                        }
                        catch (Exception ex)
                        {
                            lblStatus.Text = "WebDriver:Chrome 드라이버 테스트 실패";
                            lblStatus.ForeColor = Color.Red;
                            UTIL.MsgE($"Chrome 드라이버 테스트 중 오류가 발생했습니다: {ex.Message}");
                            return;
                        }
                    }
                }


            }
            catch (Exception ex)
            {
                lblStatus.Text = "WebDriver:Chrome 드라이버 테스트 실패";
                lblStatus.ForeColor = Color.Red;
                UTIL.MsgE($"Chrome 드라이버 테스트 중 오류가 발생했습니다: {ex.Message}");
            }
        }
        #endregion
        private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
        {
            Skill_Grid sg = new Skill_Grid();
            sg.Print_Grid_Num(sender, e);
        }

        private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
        {
            Skill_Grid sg = new Skill_Grid();
            sg.Excel_to_DataGridView(sender, e);
        }

        private void tb_SearchClient_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                // 검색 함수
                ClientSearch();
            }
        }
        #region KeyDown SUB

        private void ClientSearch()
        {
            Commodity_Search cs = new Commodity_Search(this);
            cs.StartPosition = FormStartPosition.CenterScreen;
            cs.Clinet_name = tb_SearchClient.Text;
            cs.Show();
        }
        #endregion

        async private void btn_Connect_Click(object sender, EventArgs e)
        {
            if (lbl_Client.Text == "Client")
            {
                UTIL.MsgE("납품처명을 선택해주세요");
                return;
            }
            if (lbl_Area.Text == "")
            {
                UTIL.MsgE("설정된 지역이 없습니다. 납품처 관리에서 확인해주세요.");
                return;
            }

            btn_Search.Enabled = true;

            PUB.setting.LastSearchTargetDLS = tb_SearchClient.Text.Trim();
            PUB.setting.Save();

            //로그인
            _searcher = new DLSSearcher(50);
            var ret = await _searcher.Login(this.lbl_ID.Text, this.lbl_PW.Text, this.chkShowBrowser.Checked);
            if (ret.Item1 == false)
                AR.UTIL.MsgE(ret.Item2);
        }

        DLSSearcher _searcher = null;

        async private void btn_Search_Click(object sender, EventArgs e)
        {
            if (dv1.Rows[0].Cells["ISBN"].Value == null && rBtn_ISBN.Checked)
            {
                UTIL.MsgE("ISBN이 입력되지않았습니다!");
                return;
            }
            if (dv1.Rows[0].Cells["Book_name"].Value == null && rBtn_BookName.Checked)
            {
                UTIL.MsgE("도서명이 입력되지않았습니다!");
                return;
            }
            if (_searcher == null)
            {
                AR.UTIL.MsgE("접속버튼을 눌러 사이트 로그인을 완료 하세요");
                return;
            }
            var sType = rBtn_ISBN.Checked ? "ea_isbn" : "title";
            _searcher.SetParameter(this.lbl_ID.Text, lbl_PW.Text, "유덕초등학교", sType);

            int addDelay = (int)nudAddDelay.Value * 1000;      //추가 지연시간 : 1개의 레코드 처리 후 추가 지연한다.

            foreach (DataGridViewRow dr in this.dv1.Rows)
            {
                var title = dr.Cells[0].Value?.ToString() ?? string.Empty;
                var isbn = dr.Cells[1].Value?.ToString() ?? string.Empty;
                var search = rBtn_ISBN.Checked ? isbn : title;
                var rlt = await _searcher.SearchAsync(search);
                if (rlt.IsSuccess == false)
                {
                    dr.Cells[3].Value = rlt.ErrorMessage;
                    dr.DefaultCellStyle.BackColor = Color.HotPink;
                }
                else
                {
                    //if (rlt.BookCount > 0) dr.Cells[2].Value = "Y";
                    dr.Cells[2].Value = $"{rlt.BookCount }";
                    if (rlt.BookCount == 0)
                        dr.DefaultCellStyle.BackColor = Color.WhiteSmoke;
                    else
                        dr.DefaultCellStyle.BackColor = Color.LightSkyBlue;
                }

                if (addDelay > 0)
                    await Task.Delay(addDelay);
            }


            UTIL.MsgI("완료되었습니다.");
        }


        /// <summary>
        /// DLS지역 코드 변환
        /// </summary>
        /// <returns>코드</returns>
        public string SetArea(string dlsArea, bool move = false)
        {
            string[] Area = {
                "서울", "부산", "대구", "인천", "광주",
                "대전", "울산", "세종", "경기", "강원",
                "충북", "충남", "전북", "전남", "경북",
                "경남", "제주"
            };

            string[] Code = {
                "SU", "BS", "DG", "IC", "KJ",
                "DJ", "US", "SJ", "KG", "KW",
                "CB", "CN", "JB", "JN", "KB",
                "KN", "JJ"
            };

            int idx = 0;
            foreach (string code in Area)
            {
                if (code == dlsArea)
                    break;

                idx++;
            }



            return Code[idx];
        }

        /// <summary>
        /// 지연시키는 함수
        /// </summary>
        /// <param name="ms">1000 = 1초</param>
        void Delay(int ms)
        {
            DateTime dateTimeNow = DateTime.Now;
            TimeSpan duration = new TimeSpan(0, 0, 0, 0, ms);
            DateTime dateTimeAdd = dateTimeNow.Add(duration);
            while (dateTimeAdd >= dateTimeNow)
            {
                Application.DoEvents();
                dateTimeNow = DateTime.Now;
            }
            return;
        }

        private void btn_Reflesh008_Click(object sender, EventArgs e)
        {
            for (int a = 0; a < dv1.Rows.Count; a++)
            {
                dv1.Rows[a].Cells["Check"].Value = "";
                dv1.Rows[a].DefaultCellStyle.BackColor = Color.White;
            }

        }

        private void btnStop_Click(object sender, EventArgs e)
        {
        }

        private void btn_SiteDenote_Click(object sender, EventArgs e)
        {
            if (URL == null) return;
            AR.UTIL.RunExplorer(URL);
        }

        private void label1_Click(object sender, EventArgs e)
        {
            ClientSearch();
        }

        private void lblStatus_Click(object sender, EventArgs e)
        {
            var lst = new string[]{
                "9791193110584",
            "9791168672260",
            "9788993858396",
            "9791171200351",
            "9791199239043",
            "9791194828112",
            "9791196026523",
            "9791194368359",
            "9791191744439",
            "9791198843067",
            "9788999712883",
            "9788999729188",
            "9788999729188"};

            this.dv1.Rows.Clear();
            foreach (var isbn in lst)
            {
                dv1.Rows.Add(new object[] { "", isbn, "","" });
            }
        }

        private void btn_GridReset_Click(object sender, EventArgs e)
        {
            dv1.Rows.Clear();
        }

        private void btn_ResultEmpty_Click(object sender, EventArgs e)
        {
            for (int a = 0; a < dv1.Rows.Count; a++)
            {
                dv1.Rows[a].DefaultCellStyle.ForeColor = Color.Black;
                dv1.Rows[a].DefaultCellStyle.BackColor = Color.White;
                dv1.Rows[a].Cells["dvc_count"].Value = "";
            }
        }

        private void btn_ApplyFilter_Click(object sender, EventArgs e)
        {
            int count = dv1.Rows.Count;

            if (count <= 1)
                return;

            if (chk_spChar.Checked)         // 특수문자 제거
                RemoveSpecialChar(count);

            if (chk_RemoveBrit.Checked)     // 괄호안의 문자 제거
                RemoveInBrit(count);
        }

        /// <summary>
        /// 특수문자 제거
        /// </summary>
        void RemoveSpecialChar(int count)
        {
            var booknamecol = 0;
            for (int a = 0; a < count; a++)
            {
                if (dv1.Rows[a].Cells[booknamecol].Value == null)
                    break;

                string Target = dv1.Rows[a].Cells[booknamecol].Value.ToString();

                // 구두점 제거 ,.;:/
                // Target = Target.Replace(",", "").Replace(".", "").Replace(";", "").Replace(":", "");

                string res = Regex.Replace(Target, @"[^a-zA-Z0-9가-힣_\s()]", "", RegexOptions.Singleline);

                dv1.Rows[a].Cells[booknamecol].Value = res.Trim();
            }
        }

        /// <summary>
        /// 괄호안의 문자 제거
        /// </summary>
        void RemoveInBrit(int count)
        {
            var booknamecol = 0;
            String_Text st = new String_Text();
            for (int a = 0; a < count; a++)
            {
                if (dv1.Rows[a].Cells[booknamecol].Value == null)
                    break;

                string Target = dv1.Rows[a].Cells[booknamecol].Value.ToString();

                dv1.Rows[a].Cells[booknamecol].Value = st.RemoveWordInBracket(Target).Trim();
            }
        }

        private void btn_Close_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
