using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text.Json;

namespace DataTable
{
    class Program
    {
        static void Main(string[] args)
        {
            var listDtos = new List<TestDto>(100);

            /* *** Size of TestDto calc ***
             * 
             * ** data binary size (Not implemented) **
             * Date : DateTime : 4b
             * Mode : int32? : 4b
             * User : string : 2-64b
             * WellDepth : double? : 8b
             * TOTAL data size = 18-80b
             * 
             * ** header binary size (Not implemented) **
             *
             *DateTime : len("DateTime") + 2 + len("Date") + 2 = 16b
             * Mode : 14b
             * User : 14b
             * WellDepth : 20b
             * columnsCount : 2b
             * TOTAL header size = 66b
             * 
             *  ** json as tab **
             * 
             * header size: 137b
             * json row size: 63b
             * 
             * total for 1 record  : 200b
             * total for 2 records : 263b
             * 
             *  ** json as list **
             *  
             * Raw listItem size: 175b
             * total for 2 records : 350b
             * 
             * ** example 100 records **
             * tabJsonBytes: 6602
             * listJsonBytes: 9628
             * tabBinBytes: 7765    (by dangerous BinaryFormatter)
             * listBinBytes: 4366   (by dangerous BinaryFormatter)
             */

            for (int i = 0; i < 100; i++)
                listDtos.Add(new TestDto{
                    Date = DateTime.Now.AddSeconds(i),
                    Mode = 1,
                    WellDepth = i * Math.PI 
                });

            var tMapper = new TableMapper<TestDto>();
            
            var tab = tMapper.MakeTable(listDtos);

            var e = tMapper.AsEnumerable(tab);

            var tabJson = JsonSerializer.Serialize(tab);
            var listJson = JsonSerializer.Serialize(listDtos);

            var tabJsonBytes = JsonSerializer.SerializeToUtf8Bytes(tab);
            var listJsonBytes = JsonSerializer.SerializeToUtf8Bytes(listDtos);

            var formatter = new BinaryFormatter();
            var mem = new MemoryStream();
            formatter.Serialize(mem, tab);
            var tabBinBytes = new byte[mem.Length];
            Array.Copy(mem.GetBuffer(), tabBinBytes, mem.Length);
            
            mem = new MemoryStream();
            formatter.Serialize(mem, listDtos);
            var listBinBytes = new byte[mem.Length];
            Array.Copy(mem.GetBuffer(), listBinBytes, mem.Length);
            
            Console.WriteLine($"tabJsonBytes:{tabJsonBytes.Length}");
            Console.WriteLine($"listJsonBytes:{listJsonBytes.Length}");
            Console.WriteLine($"tabBinBytes:{tabBinBytes.Length}");
            Console.WriteLine($"listBinBytes:{listBinBytes.Length}");
        }
    }
}