using AR;
using SHDocVw;
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;

namespace UniMarc
{
    public partial class AddMarc2 : Form
    {
        Helper_DB db = new Helper_DB();
        String_Text st = new String_Text();
        Help008Tag tag008 = new Help008Tag();
        private string mOldMarc = string.Empty;
        Main m;
        public AddMarc2(Main _m)
        {
            InitializeComponent();
            db.DBcon();
            marcEditorControl1.db = this.db;
            m = _m;
        }

        private void AddMarc_Load(object sender, EventArgs e)
        {
            cb_SearchCol.SelectedIndex = 0;


            TextReset();


            this.KeyPreview = true;
            uC_SelectGrade1.GradeName = "D";

        }

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == Keys.F9)
            {
                btn_Save_Click(this, EventArgs.Empty);
                return true;
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }
        public void SetKolisValueApply(string marc)
        {
            this.marcEditorControl1.SetMarcString(marc);
        }

        private void tb_ISBN_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode != Keys.Enter)
                return;
            searchMarc();


        }
        void searchMarc()
        {
            TextReset();

            string SearchText = tb_Search.Text;
            string SearchCol = cb_SearchCol.SelectedItem.ToString();
            using (var mcs = new MarcCopySelect2(SearchCol, SearchText))
                if (mcs.ShowDialog() == DialogResult.OK)
                {
                    /// 0:idx     <br></br>
                    /// 1:compidx <br></br>
                    /// 2:user    <br></br>
                    /// 3:date    <br></br>
                    /// 4:grade   <br></br>
                    /// 5:tag008  <br></br>
                    /// 6:LineMarc</param>
                    var selected = mcs.SelectedItem;
                    var defMarc = PUB.MakeEmptyMarc(selected.ISBN, "BookName", "Author", "Publisher", 0);
                    this.marcEditorControl1.LoadBookData(selected.marc_db, selected.ISBN, defMarc);
                    mOldMarc = selected.marc_db;

                    if (selected.compidx != PUB.user.CompanyIdx)
                    {
                        UTIL.MsgI($"다른 기관의 데이터 입니다\n신규 등록모드로 실행됩니다.\n\n필요한 경우 입력일자를 업데이트하세요");
                        this.lbl_Midx.Text = "신규등록";// ".idx;
                        this.lbl_Midx.Tag = null;
                        this.lbl_Midx.BackColor = Color.Tomato;
                    }
                    else
                    {
                        this.lbl_Midx.Text = selected.idx.ToString();
                        this.lbl_Midx.Tag = selected.idx;
                        this.lbl_Midx.BackColor = Color.Lime;

                    }


                    //가져온 등급으로 변경해준다. 
                    //if (selected.Grade == "0") radA.Checked = true;
                    //else if (selected.Grade == "1") radB.Checked = true;
                    //else if (selected.Grade == "2") radC.Checked = true;
                    //else if (selected.Grade == "3") radD.Checked = true;
                    if (int.TryParse(selected.Grade, out int vgrade))
                        uC_SelectGrade1.Grade = vgrade;
                    else
                        uC_SelectGrade1.Grade = -1;

                        rtEtc1.Text = selected.remark1;
                    rtEtc2.Text = selected.remark2;
                }
        }


        private void btn_Empty_Click(object sender, EventArgs e)
        {
            TextReset();

        }

        /// <summary>
        /// 전체 초기화
        /// </summary>
        /// <param name="isDelete">탭 컨트롤에서 사용할 경우 false</param>
        public void TextReset(bool isDelete = true)
        {
            if (isDelete)
            {
                var isbn = $"※{DateTime.Now.ToString("yyMMddhhmmss")}";
                var emptryMarc = PUB.MakeEmptyMarc(isbn, "title", "author", "publisher", 0);
                var emptymarc = TextResetSub();
                marcEditorControl1.LoadBookData(string.Empty, isbn, defaultMarc: emptryMarc);

                this.rtEtc1.Text = string.Empty;
                this.rtEtc2.Text = string.Empty;

                lbl_Midx.Tag = null;
                lbl_Midx.Text = "신규작성";
                lbl_Midx.BackColor = Color.Tomato;
            }
        }

        string TextResetSub()
        {
            // 입력일자 (00-05)
            // 발행년유형 (6)
            // 발행년1 (07-10)
            // 발행년2 (11-14)
            // 발행국 (15-17)

            // 삽화표시 (18-21)
            // 이용대상자수준 (22) v
            // 개별자료형태 (23) v
            // 내용형식1 (24) v
            // 내용형식2 (25) v

            // 한국대학부호 (26-27)
            // 수정레코드 (28)
            // 회의간행물 (29) c
            // 기념논문집 (30) c
            // 색인 (31)

            // 목록전거 (32)
            // 문학형식 (33) v
            // 전기 (34) v
            // 언어 (35-37) v
            // 한국정부기관부호 (38-39)
            string yyMMdd = DateTime.Now.ToString("yyMMdd");
            string yyyy = DateTime.Now.ToString("yyyy");
            string Empty_008 = yyMMdd + "s" + yyyy + "                  000   kor  ▲";
            string Empty_text = string.Format(
                $"008\t  {Empty_008.Replace("▲", "")}" +
                "020\t  \t▼a▼c▲\n" +
                "056\t  \t▼a▼2▲\n" +
                "100\t  \t▼a▲\n" +
                "245\t  \t▼a▼d▲\n" +
                "260\t  \t▼b▲\n" +
                "300\t  \t▼a▼c▲\n" +
                "653\t  \t▼a▲\n" +
                "700\t  \t▼a▲\n" +
                "950\t  \t▼b▲\n");


            return Empty_text;
        }



        /// <summary>
        /// 마크DB에 UPDATE해주는 함수
        /// </summary>
        /// <param name="Table">테이블 이름</param>
        /// <param name="MarcIndex">마크 인덱스 번호</param>
        /// <param name="FullMarc">한줄짜리 마크</param>
        /// <param name="grade">마크 등급</param>
        /// <param name="tag056">분류기호</param>
        /// <param name="v_date">저장시각 yyyy-MM-dd HH:mm:ss</param>
        void UpdateMarc(string MarcIndex, string FullMarc, string grade)
        {
            int targetMarcIdx = 0;
            int.TryParse(MarcIndex, out targetMarcIdx);
            int targetGrade = 2;
            if (int.TryParse(grade, out int parsedGrade)) targetGrade = parsedGrade;

            // 3. 공통 저장 메서드 호출
            var saveResult = Helper_DB.UpdateMarc(targetMarcIdx, FullMarc, targetGrade, rtEtc1.Text.Trim(), rtEtc2.Text.Trim(), "", mOldMarc);

            if (saveResult.result == false)
            {
                UTIL.MsgE(saveResult.message);
                return;
            }

            // 4. UI 결과 반영
            if (MarcIndex.isEmpty())
            {
                lbl_Midx.Tag = saveResult.newidx.ToString();
                lbl_Midx.Text = saveResult.newidx.ToString();
                lbl_Midx.BackColor = Color.Lime; // 저장 성공 후 색상 변경 (AddMarc2 특화)
                UTIL.MsgI($"저장 완료\n\nIDX:{saveResult.newidx}");
            }
            else
            {
                UTIL.MsgI("변경 완료");
            }

        }

        private void Btn_SearchKolis_Click(object sender, EventArgs e)
        {
            AddMarc_FillBlank af = new AddMarc_FillBlank(this);
            af.Show();
        }

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

        private void button2_Click(object sender, EventArgs e)
        {
            searchMarc();
        }

        private void btSave_Click(object sender, EventArgs e)
        {
            var midx = lbl_Midx.Tag?.ToString() ?? string.Empty;
            if (midx.isEmpty())
            {
                UTIL.MsgE("저장할 마크를 불러오세요\n신규마크작성상태에서는 추가 버튼을 사용하세요");
                return;
            }
            SaveData(true);
        }
        private void btn_Save_Click(object sender, EventArgs e)
        {
            SaveData(false);
        }

        void SaveData(bool isUpdate)
        {
            string tag008 = marcEditorControl1.text008.Text;

            //입력일자를 업데이트할지 확인한다.
            if (isUpdate == false)
            {
                var inputdate = tag008.Substring(0, 6);
                if (inputdate == "000000")
                    inputdate = DateTime.Now.ToString("yyMMdd");
                else if (inputdate != DateTime.Now.ToString("yyMMdd"))
                {
                    if (UTIL.MsgQ($"입력일자({inputdate})를 오늘로 변경할까요?") == DialogResult.Yes)
                    {
                        tag008 = DateTime.Now.ToString("yyMMdd") + tag008.Substring(6);
                        marcEditorControl1.text008.Text = tag008;
                    }
                }
            }

            if (marcEditorControl1.CheckValidation() == false) return;

            string tag056 = marcEditorControl1.Tag056(out string with008TagOutput);// Tag056(dbMarc, _param);

            //tag056을 호출해야 008이추가된다.그런후에 데이터를 처리해야함
            string fullMarc = marcEditorControl1.MakeMarcString();
            var marcString = marcEditorControl1.richTextBox1.Text;

        
            var parserF = new UniMarc.MarcParser();
            parserF.ParseFullMarc(fullMarc);

            string midx = this.lbl_Midx.Tag?.ToString() ?? string.Empty;
            if (isUpdate == false) midx = string.Empty;

            // ISBN 추출 및 중복 체크 추가
            var tag_020 = parserF.GetTag<MarcField>("020").FirstOrDefault();
            var v_isbn = tag_020?.GetSubfieldValue('a') ?? string.Empty;

            // 신규 저장 시 중복 ISBN 체크
            if (midx.isEmpty() && !v_isbn.isEmpty())
            {
                if (DB_Utils.ExistISBN(v_isbn))
                {
                    if (UTIL.MsgQ("동일한 ISBN이 이미 존재합니다. 그래도 저장하시겠습니까?") == DialogResult.No)
                        return;
                }
            }

            var v_grade = uC_SelectGrade1.Grade == -1 ? string.Empty : uC_SelectGrade1.Grade.ToString();
            

            //midx 값이 emptry 라면 insert , 아니라면 update
            UpdateMarc(midx, fullMarc, v_grade);


        }

        private void rtEtc1_KeyDown(object sender, KeyEventArgs e)
        {
            var rt = sender as RichTextBox;
            if (rt == null) return;
            if (e.KeyCode == Keys.F5)
            {
                rt.AppendText("["+DateTime.Now.ToString("yy-MM-dd")+"]");
            }
        }
    }
}
