using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.IO;
using System.Windows.Forms;

namespace CheckTool {
    class ClassCSV
    {
        private string[] doc_csv_Shop;
        private string[] doc_csv_Char;
        private string[] doc_csv_Fight;
        private string[] doc_csv_Item;
        private string[] doc_csv_Package;
        private string[] doc_csv_Skill;
        private string[] doc_csv_Weapon;
        private string[] doc_csv_RandBox;
        private string[] doc_csv_Limit;
        private string[] doc_csv_Event;
        Dictionary<string, string> dicXML_Shop;

        CheckTool cForm;

        public ClassCSV(CheckTool CheckFormUse) {
            cForm = CheckFormUse;
            dicXML_Shop = new Dictionary<string, string>();
        }
        
        public bool SetCSV(string strName, string strFilePath) 
        {
            string[] doc_temp;
            try {
                doc_temp = File.ReadAllLines(strFilePath, System.Text.Encoding.Default);
            } catch (FileLoadException) {
                // 로드 에러
                MessageBox.Show(strFilePath + "파일 로드 중 에러");
                return false;
            } catch (FileNotFoundException) {
                // 파일이 없음
                MessageBox.Show(strFilePath + "파일이 해당 경로에 없음");
                return false;
            } catch (IOException) {
                // 다른 프로그램에서 이미 사용중
                MessageBox.Show(strFilePath + "파일을 다른 프로그램에서 사용중임");
                return false;
            }
            
            switch(strName)
            {
                case "Shop" :
                    doc_csv_Shop = doc_temp;
                    break;
                case "Char":
                    doc_csv_Char = doc_temp;
                    break;
                case "Fight":
                    doc_csv_Fight = doc_temp;
                    break;
                case "Item":
                    doc_csv_Item = doc_temp;
                    break;
                case "Package":
                    doc_csv_Package = doc_temp;
                    break;
                case "Skill":
                   doc_csv_Skill = doc_temp;
                    break;
                case "Weapon":
                    doc_csv_Weapon = doc_temp;
                    break;
                case "RandBox":
                    doc_csv_RandBox = doc_temp;
                    break;
                case "Limit":
                    doc_csv_Limit = doc_temp;
                    break;
                case "Event":
                    doc_csv_Event = doc_temp;
                    break;
            }
            return true;
        }

        public bool SetCSVAll(string strFolderPath) {
            strFolderPath = strFolderPath + @"\";
            if( SetCSV("Shop", strFolderPath+ "ShopTable.csv") == false)
                return false;
            if ( SetCSV("Char", strFolderPath + "CharacterTable.csv") == false)
                return false;
            if (SetCSV("Fight", strFolderPath + "FightTable.csv") == false)
                return false;
            if (SetCSV("Item", strFolderPath + "ItemTable.csv") == false)
                return false;
            if (SetCSV("Package", strFolderPath + "PackageTable.csv") == false)
                return false;
            if (SetCSV("Skill", strFolderPath + "SkillTable.csv") == false)
                return false;
            if (SetCSV("Weapon", strFolderPath + "Weapon.csv") == false)
                return false;
            if (SetCSV("RandBox", strFolderPath + "RandBoxTable.csv") == false)
                return false;
            if (SetCSV("Limit", strFolderPath + "LimitItemTable.csv") == false)
                return false;
            if (SetCSV("Event", strFolderPath + "EventItemTable.csv") == false)
                return false;

            return true;
        }

        public void CompShopChar() {
            // Shop엔 있고 Character엔 없는 것
            cForm.OutputTxt("== CharacterTable.csv & ShopTable.csv (CharacterTable에 없는 ShopTable ID) ==");
            cForm.OutputTxt("-- ID, Name --");
            IEnumerable<string> Query =
                from shop in doc_csv_Shop
                let sh = shop.Split(',')
                where !(from char_ in doc_csv_Char
                        let ch = char_.Split(',')
                        select ch[1]) 
                          .Contains(sh[1])
                          && sh[3] == "1" // 타입이 1인것(캐릭터)
                select sh[1] + "," + sh[2];

            Query = Query.Skip(1);

            foreach (var data in Query) {
                cForm.OutputError(data);
            }
        }

        public void CompSkillFight() {
            // Skill에 이 있는 ID가 Fight에 없을때
            cForm.OutputTxt("" + '\r' + '\n');
            cForm.OutputTxt("== FightTable.csv & SkillTable.csv (FightTable에 없는 SkillTable ID) ==");
            cForm.OutputTxt("-- ID, Name --");
            IEnumerable<string> Query =
                from skill in doc_csv_Skill
                let sk = skill.Split(',')
                where !(from fight in doc_csv_Fight
                        let fi = fight.Split(',')
                        where fi[3].StartsWith("3") //3은 스킬
                        select fi[1]) // ID
                        .Contains(sk[1]) //ID
                select sk[1] + "," + sk[2];

            Query = Query.Skip(1);

            foreach (var data in Query) {
                cForm.OutputError(data);
            }
        }

        public void CompShopFight() {
            // Fight엔 있고 Shop엔 없는 것
            cForm.OutputTxt("" + '\r' + '\n');
            cForm.OutputTxt("== ShopTable.csv & FightTable.csv (FightTable에 없는 ShopTable ID) ==");
            IEnumerable<string> Query =
                from fight in doc_csv_Fight
                let fi = fight.Split(',')
                where !(from shop in doc_csv_Shop
                        let sh = shop.Split(',')
                        select sh[1]) // ID
                        .Contains(fi[3]) //Code_ID
                select fi[3] + "," + fi[18];

            Query = Query.Skip(1);

            foreach (var data in Query) {
                cForm.OutputError(data);
            }
        }

        public void CompShopItem() {
            // Shop엔 있고 Item엔 없는 것
            cForm.OutputTxt("" + '\r' + '\n');
            cForm.OutputTxt("== ShopTable.csv & ItemTable.csv (ItemTable에 없는 ShopTable ID) ==");
            cForm.OutputTxt("-- ID, Name --");
            IEnumerable<string> Query =
                from shop in doc_csv_Shop
                let sh = shop.Split(',')
                where !(from item in doc_csv_Item
                        let it = item.Split(',')
                        select it[1])
                          .Contains(sh[1])
                          && (sh[3] == "2" || sh[3] == "7" || sh[3] =="8") // 타입이 2(무기), 7(기능성), 8(알)
                select sh[1] + "," + sh[2];

            Query = Query.Skip(1);

            foreach (var data in Query) {
                cForm.OutputError(data);
            }
        }

        public void CompShopSkill() {
            // Shop엔 있고 Skill엔 없는 것
            cForm.OutputTxt("" + '\r' + '\n');
            cForm.OutputTxt("== ShopTable.csv & SkillTable.csv (SkillTable에 없는 ShopTable ID) ==");
            cForm.OutputTxt("-- ID, Name --");
            IEnumerable<string> Query =
                from shop in doc_csv_Shop
                let sh = shop.Split(',')
                where !(from skill in doc_csv_Skill
                        let sk = skill.Split(',')
                        select sk[1])
                          .Contains(sh[1])
                          && (sh[3] == "3") // 타입이 3(스킬)
                select sh[1] + "," + sh[2];

            Query = Query.Skip(1);

            foreach (var data in Query) {
                cForm.OutputError(data);
            }
        }

        public void CompShopRandBox(){
            // RandBox에 있는 데이터와 Shop 데이터 비교
            cForm.OutputTxt("" + '\r' + '\n');
            cForm.OutputTxt("== RandBoxTable.csv & ShopTable.csv (Type, Value) 비교 ==");
            cForm.OutputTxt("-- GetItem_ID, Get_Type, Get_Value --");
            IEnumerable<string> Query =
                from rand in doc_csv_RandBox
                let ra = rand.Split(',')
                from shop in doc_csv_Shop
                let sh = shop.Split(',')
                //Value까지 고려 한거 
                where (ra[3] == sh[1]) && ((ra[4] != sh[5]) || (ra[5] != sh[6] && ra[5] != sh[8] && ra[5] != sh[10] && ra[5] != sh[12] && ra[5] != sh[14]))
                //Value고려하지 않은거.
                //where (ra[3] == sh[1]) && (ra[4] != sh[5])
                //select rand;
                //ra[3] GenItem_ID, ra[4] Get_Type, ra[5] Get_value, ra[7] Note
                select ra[3] + "," + ra[4] + "," + ra[5] + "," + ra[7];

            foreach (var data in Query) {
                cForm.OutputError(data);
            }
        }

        public void CompShopWeapon(){
            // Shop엔 있고 Weapon엔 없는 것
            cForm.OutputTxt("" + '\r' + '\n');
            cForm.OutputTxt("== Weapon.csv & ShopTable.csv (Weapon에 없는 ShopTable ID) ==");
            cForm.OutputTxt("-- ID, Name --");
            IEnumerable<string> Query =
                from shop in doc_csv_Shop
                let sh = shop.Split(',')
                where !(from weapon in doc_csv_Weapon
                        let we = weapon.Split(',')
                        select we[0])
                        .Contains(sh[1])
                        //&& (sh[3] == "2") // Type 2는 무기
                        && (sh[1].StartsWith("25")) // 25로 시작하는건 무기
                //select weapon;
                //sh[1] id, sh[2] Name
                select sh[1] + "," + sh[2];

            Query = Query.Skip(1);

            foreach (var data in Query) {
                cForm.OutputError(data);
            }
        }

        public void CompItemWeapon() {
            // Weapon엔 있고 Item엔 없는 것
            cForm.OutputTxt("" + '\r' + '\n');
            cForm.OutputTxt("== Weapon.csv & ItemTable.csv (Weapon에 없는 ItemTable ID) ==");
            cForm.OutputTxt("-- ID, Name --");
            IEnumerable<string> Query =
                from item in doc_csv_Item
                let it = item.Split(',')
                where !(from weapon in doc_csv_Weapon
                        let we = weapon.Split(',')
                        select we[0])
                        .Contains(it[1])
                        && it[1].StartsWith("25") // 25로 시작하는건 무기
                //select weapon;
                //it[1] ID, it[2] name
                select it[1] + "," + it[2];

            Query = Query.Skip(1);

            foreach (var data in Query) {
                cForm.OutputError(data);
            }
        }

        public void CompShopPackage() {
            // Package에 있는 데이터와 Shop 데이터 비교
            cForm.OutputTxt("" + '\r' + '\n');
            cForm.OutputTxt("== PackageTable.csv & ShopTable.csv (Type) 비교 ==");
            for(int i = 0, j = 1; j <= 5 ; i = i+3, j++)
            {
                cForm.OutputTxt("-- Code, Type, Name " + j.ToString() + "--");
                IEnumerable<string> Query =
                    from pack in doc_csv_Package
                    let pa = pack.Split(',')
                    from shop in doc_csv_Shop
                    let sh = shop.Split(',')
                    //Value 고려
                    //where (pa[i + 5] == sh[1]) && ((pa[i + 6] != sh[5]) || (pa[i + 7] != sh[6] && pa[i + 7] != sh[8] && pa[i + 7] != sh[10] && pa[i + 7] != sh[12] && pa[i + 7] != sh[14]))

                    //Value 뺌
                    where (pa[i + 5] == sh[1]) && (pa[i + 6] != sh[5])
                    //select pack;
                    //pa[i+5] Codei, pa[i+6] Typei, pa[i+7] Value, sh[2] Name
                    //Value 뺌
                    //select pa[i + 5] + "," + pa[i + 6] + "," + pa[i + 7] + "," + sh[2];
                    select pa[i + 5] + "," + pa[i + 6] + "," + sh[2];

                foreach (var data in Query) {
                    cForm.OutputError(data);
                }
            }
        }

        public void CompShopLimit() {
            // LimitItem과 shop과 비교
            cForm.OutputTxt("" + '\r' + '\n');
            //cForm.OutputTxt("== LimitItemTable.csv 데이터와 ShopTable.csv 데이터 일치하지 않는 것 ==");
            cForm.OutputTxt("== LimitItemTable.csv & ShopTable.csv (ID, StartDay, EndDay) 비교 ==");
            cForm.OutputTxt("-- ID, Name, StartDay, EndDay --");

            IEnumerable<string> Query =
                from limit in doc_csv_Limit
                let li = limit.Split(',')
                where !(from shop in doc_csv_Shop
                        let sh = shop.Split(',')
                        select sh[1])
                        .Contains(li[0])
                //select weapon;
                //it[1] ID, it[2] name
                select li[0] + "," + li[1] + "," + li[2] + "," + li[3];

            Query = Query.Skip(1);

            foreach (var data in Query) {
                cForm.OutputError(data);
            }

            IEnumerable<string> Query2 =
                from limit in doc_csv_Limit
                let li = limit.Split(',')
                from shop in doc_csv_Shop
                let sh = shop.Split(',')
                where (li[0] == sh[1]) && ((li[2] != sh[21]) || (li[3] != sh[22]))
                //li[0] : ID, li[1] : Name, li[2] : StartDay, li[3] : EndDay
                select li[0] + "," + li[1] + "," + li[2] + "," + li[3];

            foreach (var data in Query2) {
                cForm.OutputError(data);
            }
        }
        public void CompShopEvent(){
            // Event와 Shop 비교
            cForm.OutputTxt("" + '\r' + '\n');
            cForm.OutputTxt("== EventTable.csv & ShopTable.csv (Get_Type) 비교 ==");
            cForm.OutputTxt("-- ID, Name, Get_Type --");

            IEnumerable<string> Query =
                from event_ in doc_csv_Event
                let ev = event_.Split(',')
                from shop in doc_csv_Shop
                let sh = shop.Split(',')
                where ev[1] == sh[1] && ev[2] != sh[5]
                // ev[1] ID, ev[5] Name, ev[2] Get_Type
                select ev[1] + "," + ev[5] + "," + ev[2];

            foreach (var data in Query) {
                cForm.OutputError(data);
            }    
        } 
    }
}

+ Recent posts