using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;

// BinaryPackNX̓쌟ؗpR[h
public class BinaryPack_Test : MonoBehaviour
{
    void Start()
    {
        test1();
        Debug.Log("--------------------call test1()");
        test2();
        Debug.Log("--------------------call test2()");
        test3();
        Debug.Log("--------------------call test3()");
        test3();

    }

    void test1()
    {
        BinaryPack.Data[] bindatas = new BinaryPack.Data[3];

        bindatas[0] = BinaryPack.getBytesByInt(123);//123binaryɃVACY

        bindatas[1] = BinaryPack.getBytesByFloat(1.23f);//1.23fbinaryɃVACY

        bindatas[2] = BinaryPack.getBytesByString("ABCxyz");//"ABCxyz"binaryɃVACY

        // LŃVACYR̃oCif[^ȉŕĕ\Ă܂B
        int idx = 0;
        int n = (int)BinaryPack.getObjectOfInt(bindatas[0].bytes, ref idx);
        Debug.Log($"{bindatas[0].bytes.Length}byte畜====={n}");

        idx = 0;
        float f = (float)BinaryPack.getObjectOfFloat(bindatas[1].bytes, ref idx);
        Debug.Log($"{bindatas[1].bytes.Length}byte畜====={f}");

        idx = 0;
        string s = BinaryPack.getObjectOfString(bindatas[2].bytes, ref idx);
        Debug.Log($"{bindatas[2].bytes.Length}byte畜====={s}");
    }

    void test2()
    {
        List<BinaryPack.Data> list = new List<BinaryPack.Data>();// ܂Ƃ߂ăVACY邽߂̃Xg
        int Count = 0;
        BinaryPack.Data bindata;

        list.Add(bindata = BinaryPack.getBytesByInt(123));//123binaryɃVACY
        Count += bindata.bytes.Length + 1;

        list.Add(bindata = BinaryPack.getBytesByFloat(1.23f));//1.23fbinaryɃVACY
        Count += bindata.bytes.Length + 1;

        list.Add(bindata = BinaryPack.getBytesByString("ABCxyz"));//"ABCxyz"binaryɃVACY
        Count += bindata.bytes.Length + 1;

        byte[] serializedBuff = new byte[Count];// ̃oCizɁA܂Ƃ߂ăVACYB
        int idx_buff = 0;
        foreach (BinaryPack.Data d in list)// VACY̌JԂ
        {
            serializedBuff[idx_buff++] = (byte)d.id;
            Buffer.BlockCopy(d.bytes, 0, serializedBuff, idx_buff, d.bytes.Length);
            idx_buff += d.bytes.Length;
        }
        Debug.Log($"Ŝ{serializedBuff.Length}bytebufferɃVACYꂽ");


        for (idx_buff = 0; idx_buff < serializedBuff.Length;)// JԂōs
        {   
            int iBack = idx_buff; 
            int id = serializedBuff[idx_buff++];//IuWFNgID擾
            object obj = BinaryPack.dencoders[id](serializedBuff, ref idx_buff);// eIuWFNg̕
            Debug.Log($"{idx_buff - iBack}byte畜====={obj}");
        }
    }

    void test3()
    {
        BinaryPack binaryPack = new BinaryPack();
        binaryPack.Add(BinaryPack.getBytesByInt(123));//123binaryɃVACY
        binaryPack.Add(BinaryPack.getBytesByFloat(1.23f));//1.23fbinaryɃVACY
        binaryPack.Add(BinaryPack.getBytesByString("ABCxyz"));//"ABCxyz"binaryɃVACY
        byte[] serializedBuff = binaryPack.GetSerializedBuffer();// ܂Ƃ߂ăVACYB
        Debug.Log($"Ŝ{serializedBuff.Length}bytebufferɃVACYꂽ");

        using (FileStream stream = File.Open("test.bin", FileMode.Create))
        {
            stream.Write(serializedBuff, 0, serializedBuff.Length);// t@Cɏ
        }

        int idx_buff = 0;
        while (idx_buff < serializedBuff.Length)
        {
            int iBack = idx_buff;
            object obj = BinaryPack.GetDeserializedObject(serializedBuff, ref idx_buff);// eIuWFNg̕
            Debug.Log($"{idx_buff - iBack}byte畜====={obj}");
        }
    }
}

