using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using EDefterConsoleWS.EDefterOlusturWS;
using EDefterConsoleWS.EDefterTest;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

namespace EDefterConsoleWS
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                userService.userService login = new userService.userService();
                EDefterTest.EDefterWS defterSaklama = new EDefterTest.EDefterWS();
                EDefterOlusturWS.DefterOlusturWebServices methodsDefOlustur = new EDefterOlusturWS.DefterOlusturWebServices();

                login.CookieContainer = new System.Net.CookieContainer();
                defterSaklama.CookieContainer = login.CookieContainer;
                methodsDefOlustur.CookieContainer = login.CookieContainer;
            //test.defter
            
                string userId = "testEfinans";
                string password = "password";
                login.wsLogin(userId, password, "tr");

                string vknTckn = "3250566851";
                string donem = "201701";
                string subeKodu = "0000";

                menu(methodsDefOlustur, vknTckn, donem, subeKodu);

                /*EDefter Oluşturma Metotları*/

                //EDefterCsvFileYukle(methodsDefOlustur, vknTckn, donem, subeKodu);
                //EDefterCsvDosyaIsle(methodsDefOlustur, vknTckn, donem, subeKodu);
                //EDefterDefterOlustur(methodsDefOlustur, vknTckn, donem, subeKodu);
                //EdefterCsvDurumSorgula(methodsDefOlustur, vknTckn, donem, subeKodu);

                //EDefterGetKalanKullanim(methodsDefOlustur, vknTckn);



                //EDefter Saklama Metotları
                //EdefterDosyaSakla(methods);
            }
            catch (Exception exp)
            {

                Console.WriteLine(exp.Message);
            }
            

            Console.ReadLine();

        }

        private static void menu(DefterOlusturWebServices methodsDefOlustur, string vknTckn, string donem, string subeKodu)
        {
            int secim = secimListesi();

            switch (secim)
            {
                case 1: EDefterCsvFileYukle(methodsDefOlustur, vknTckn, donem, subeKodu); Console.WriteLine(); menu(methodsDefOlustur, vknTckn, donem, subeKodu); break;
                case 2: EDefterCsvDosyaIsle(methodsDefOlustur, vknTckn, donem, subeKodu); Console.WriteLine(); menu(methodsDefOlustur, vknTckn, donem, subeKodu); break;
                case 3: EDefterDefterOlustur(methodsDefOlustur, vknTckn, donem, subeKodu); Console.WriteLine(); menu(methodsDefOlustur, vknTckn, donem, subeKodu); break;
                case 4: EdefterCsvDurumSorgula(methodsDefOlustur, vknTckn, donem, subeKodu); Console.WriteLine(); menu(methodsDefOlustur, vknTckn, donem, subeKodu); break;
                case 5: EDefterGetKalanKullanim(methodsDefOlustur, vknTckn); Console.WriteLine(); menu(methodsDefOlustur, vknTckn, donem, subeKodu); break;

                default: Console.WriteLine("1-5 arası değer giriniz:"); Console.WriteLine(); menu(methodsDefOlustur, vknTckn, donem, subeKodu); break;

            }
        }

        private static int secimListesi()
        {
            int secim = 0;
            try
            {
                Console.WriteLine("Seçiminizi yapınız: ");
                Console.WriteLine("1-EDefterCsvFileYukle" +
                                  "\n2-EDefterCsvDosyaIsle" +
                                  "\n3-EDefterDefterOlustur" +
                                  "\n4-EdefterCsvDurumSorgula" +
                                  "\n5-EDefterGetKalanKullanim");

                Console.Write("Seçiminizi giriniz: ");
                secim = int.Parse(Console.ReadLine());
                Console.WriteLine("\n");
                //return secim;            
            }
            catch (Exception)
            {
                Console.WriteLine("\n!!! 1-5 arası değer giriniz...\n ");
                secimListesi();
            }
            return secim;
        }

        private static void EDefterGetKalanKullanim(DefterOlusturWebServices methodsDefOlustur, string vknTckn)
        {
            EDefterOlusturWS.eDefterGetKalanKullanimInput input = new EDefterOlusturWS.eDefterGetKalanKullanimInput();
            EDefterOlusturWS.eDefterGetKalanKullanimOutput output = new EDefterOlusturWS.eDefterGetKalanKullanimOutput();

            input.vknTckn = vknTckn;

            EDefterOlusturWS.eDefterWebServiceResponse eDefResp = methodsDefOlustur.eDefterGetKalanKullanim(input, ref output);

            Console.WriteLine("SonuçKodu: " + eDefResp.sonucKodu +
                              "\nSonuç Açıklama: " + eDefResp.sonucAciklama +
                              "\nEk Bilgi: " + eDefResp.ekBilgi);

            Console.WriteLine("Kalan Miktar: " + output.kalanMiktar);

            
        }

        private static void EdefterCsvDurumSorgula(DefterOlusturWebServices methodsDefOlustur, string vknTckn, string donem, string subeKodu)
        {

            eDefterCsvDurumSorgulaInput input = new eDefterCsvDurumSorgulaInput();
            eDefterCsvDurumSorgulaOutput output = new eDefterCsvDurumSorgulaOutput();

            input.vknTckn = vknTckn;
            input.donem = donem;
            input.subeKodu = subeKodu;


            EDefterOlusturWS.eDefterWebServiceResponse eDefResp = methodsDefOlustur.eDefterCsvDurumSorgula(input, ref output);
            
            Console.WriteLine("SonuçKodu: " + eDefResp.sonucKodu +
                              "\nSonuç Açıklama: " + eDefResp.sonucAciklama +
                              "\nEk Bilgi: " + eDefResp.ekBilgi);

            Console.WriteLine("SonuçKodu: " + output.durumKodu +
                              "\nSonuç Açıklama: " + output.durumAciklama);

            System.IO.File.WriteAllBytes(@"C:\Users\osman.cuhadar\Desktop\eDefterSample\hataDosyasi.zip", output.hataDosya);

            

            string text = Convert.ToBase64String(output.hataDosya);
            string textAciklama = System.Text.Encoding.UTF8.GetString(System.Convert.FromBase64String(text));
            Console.WriteLine("\nHata Dosyası İçeriği: \n" + textAciklama);
        }

        private static void EDefterDefterOlustur(EDefterOlusturWS.DefterOlusturWebServices methodsDefOlustur, string vknTckn, string donem, string subeKodu)
        {
            eDefterDefterOlusturInput input = new eDefterDefterOlusturInput();
            input.vknTckn = vknTckn;
            input.donem = donem;
            input.subeKodu = subeKodu;

            EDefterOlusturWS.eDefterWebServiceResponse eDefResp = methodsDefOlustur.eDefterDefterOlustur(input);
            

            Console.WriteLine("SonuçKodu: " + eDefResp.sonucKodu +
                              "\nSonuç Açıklama: " + eDefResp.sonucAciklama +
                              "\nEk Bilgi: " + eDefResp.ekBilgi);
        }

        private static void EDefterCsvDosyaIsle(DefterOlusturWebServices methodsDefOlustur, string vknTckn, string donem, string subeKodu)
        {
            eDefterCsvDosyaIsleInput input = new eDefterCsvDosyaIsleInput();
            input.vknTckn = vknTckn;
            input.donem = donem;
            input.subeKodu = subeKodu;
            EDefterOlusturWS.eDefterWebServiceResponse eDefResp = methodsDefOlustur.eDefterCsvDosyaIsle(input);

            Console.WriteLine("SonuçKodu: " + eDefResp.sonucKodu +
                              "\nSonuç Açıklama: " + eDefResp.sonucAciklama +
                              "\nEk Bilgi: " + eDefResp.ekBilgi);

        }

        private static void EDefterCsvFileYukle(DefterOlusturWebServices methodsDefOlustur, string vknTckn, string donem, string subeKodu)
        {
            eDefterCsvFileYukleInput input = new eDefterCsvFileYukleInput();
            input.vknTckn = vknTckn;
            input.donem = donem;
            input.subeKodu = subeKodu;
            eDefterCsvFileYukleInputEntry entry1 = new eDefterCsvFileYukleInputEntry();
            entry1.key = "dosya";
            //entry1.value = System.IO.File.ReadAllBytes(@"C:\Users\osman.cuhadar\Desktop\eDefterSample\9394959643_0000_201701_1.zip");
            entry1.value = System.IO.File.ReadAllBytes(@"C:\Users\osman.cuhadar\Desktop\9394959643_0000_201701_1.zip");

            eDefterCsvFileYukleInputEntry entry2 = new eDefterCsvFileYukleInputEntry();
            entry2.key = "dosyaIsmi";
            //entry2.value = "3250566851_0000_201612_1.zip";
            entry2.value = "9394959643_0000_201701_1.zip";

            eDefterCsvFileYukleInputEntry[] respArray = new eDefterCsvFileYukleInputEntry[2] { entry1, entry2 };

            input.parametreList = respArray;

            EDefterOlusturWS.eDefterWebServiceResponse eDefResp = methodsDefOlustur.eDefterCsvFileYukle(input);

            Console.WriteLine("SonuçKodu: "+ eDefResp.sonucKodu +
                              "\nSonuç Açıklama: "+ eDefResp.sonucAciklama +
                              "\nEk Bilgi: "+ eDefResp.ekBilgi);

            base64cevir(entry1.value);
        }

        private static void base64cevir(object value)
        {
            
            string text = Convert.ToBase64String(ObjectToByteArray(value));
            System.IO.File.WriteAllText(@"C:\Users\osman.cuhadar\Desktop\eDefterSample\deneme.txt", text);
        }

        private static byte[] ObjectToByteArray(object obj)
        {
            if (obj == null)
                return null;
            BinaryFormatter bf = new BinaryFormatter();
            using (MemoryStream ms = new MemoryStream())
            {
                bf.Serialize(ms, obj);
                return ms.ToArray();
            }
        }

   
        private static void EdefterDosyaSakla(EDefterWS defterSaklama)
        {
            eDefterDosyaSaklaInput arg0 = new eDefterDosyaSaklaInput();
            arg0.donem = "201606";
            arg0.subeKodu = "0000";
            arg0.vknTckn = "3250566851";

            eDefterDosyaSaklaInputEntry h = new eDefterDosyaSaklaInputEntry();
            h.key = "";
            h.value = "";

            arg0.parametreList = new eDefterDosyaSaklaInputEntry[] { h };

            EDefterTest.eDefterWebServiceResponse eDefWSRes = defterSaklama.edefterDosyaSakla(arg0);

            string sonucKodu = eDefWSRes.sonucKodu;
            string sonucAciklama = eDefWSRes.sonucAciklama;
            string ekBilgiler = eDefWSRes.ekBilgi;
        }
    }
}
