using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using href.Utils;
using KlerksSoft;
using Mozilla.CharDet;
using Ude;

namespace EncodeDetector
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Count() == 0)
            {
                Console.WriteLine("Informe um arquivo");
                return;
            }

            //limpa o console
            Console.Clear();
            Console.WriteLine("Econding detectado para o arquivo: " + args[0]);
            Console.WriteLine("");

            //crio o vetor de bytes com o conteudo do arquivo
            byte[] queEuGosto = TextUtils.FileToBytes(args[0]);


            #region encoding tools
            //Usando encoding tools
            //fonte:http://www.codeproject.com/KB/recipes/DetectEncoding.aspx
            Encoding enc1 = EncodingTools.DetectInputCodepage(queEuGosto);
            if (enc1 != null)
                Console.WriteLine("Encoding Tools\t-->\t" + enc1.EncodingName + "/" + enc1.BodyName + "/" + enc1.CodePage);
            #endregion


            #region TextFileEncodingDetector
            //fonte: https://gist.github.com/TaoK/945127
            Encoding enc2 = TextFileEncodingDetector.DetectTextByteArrayEncoding(queEuGosto);
            if (enc2 != null)
                Console.WriteLine("TextFileEncodingDetector\t-->\t" + enc2.EncodingName + "/" + enc2.BodyName + "/" + enc2.CodePage);
            #endregion


            #region chardet
            //fonte: http://code.google.com/p/chardetsharp/
            var d = new UniversalDetector();
            d.HandleData(queEuGosto);
            d.DataEnd();            
            Encoding enc3 = Encoding.GetEncoding( d.DetectedCharsetName);
            if (enc3 != null)
                Console.WriteLine("CharDet\t-->\t" + enc3.EncodingName + "/" + enc3.BodyName + "/" + enc3.CodePage);
            #endregion


            #region UDE via VtrEncodingDetector wrapper
            //usando um wrapper para UDE
            Encoding enc4 = VtrEncodingDetector.GetEncodingFile(queEuGosto);
            if (enc4 != null)
                Console.WriteLine("VtrEncodingDetector\t-->\t" + enc4.EncodingName + "/" + enc4.BodyName + "/" + enc4.CodePage);
            #endregion


            #region UDE direto
            //uando UDE direto
            //fonte: http://code.google.com/p/ude/
            CharsetDetector cdet = new CharsetDetector();
            cdet.Feed(queEuGosto, 0, queEuGosto.Length);
            cdet.DataEnd();
            Encoding enc5 = Encoding.GetEncoding(cdet.Charset);
            if (enc5 != null)
            {
                Console.WriteLine("UDE\t-->\t" + enc5.EncodingName + "/" + enc5.BodyName + "/" + enc5.CodePage + " Com confiabilidade de " + (cdet.Confidence * 100).ToString("0.0") + "%");
                foreach (var x in cdet.CharsetProbers)
                {
                    if (x != null)
                        Console.WriteLine("\t- " + x.GetCharsetName() + "\t" + (x.GetConfidence() * 100).ToString("0.00"));
                }
            }
            cdet.Reset();
            #endregion 


            //só para podermos ver o resultado
            //Console.ReadLine();
        }
    }
}
