#include "transmission.h"
#include<iostream>

static int num_samples = 3;
static int num_packages = 20;
static  int buffer = 100;

static std::vector<bool> data;
static std::vector<bool> samples[10];

static std::vector<bool> fix(int from, int n)
{
    std::vector<bool> ans;
    int ind[num_samples] = {0};
    for(int i = 0; i < n; i ++)
    {
        int ones = 0;
        for(int j = 0; j < num_samples; j ++)
        {
            ones += samples[j][from + ind[j]];
        }
        bool cor = (ones * 2 >= num_samples);

        for(int j = 0; j < num_samples; j ++)
        {
            if(samples[j][from + ind[j]] == cor)   ind[j] ++;
        }

        ans.push_back(cor);
    }
    return ans;
}

std::vector<bool> receive(const std::vector<bool>& message, int n, int d)
{
    if(d == 1)
    {
        buffer = 4;
        num_packages = 1;
        num_samples = 3;
    }

    int m = message.size();
    int package_size = n / num_packages;

    int ones = 0;
    int sc = 0;

    for(int i = 0; i < m; i ++)
    {
        if(message[i] == 0)
        {
            if(ones > buffer / 2)
            {
                /// recieve
                i ++;
                for(int j = 0; j < package_size; j ++)
                {
                    samples[sc / num_packages].push_back(message[i]);
                    i ++;
                }
                sc ++;
            } else {
                ones = 0;
            }
        } else {
            ones ++;
        }
    }


    for(int i = 0; i < num_packages; i ++)
    {
        std::vector<bool> p = fix(i * package_size, package_size);
        for(auto j: p)
        {
            data.push_back(j);
        }
    }

    /*std::cout<< "HI\n";
    for(int i = 0; i < num_samples; i ++)
    {
        for(int j = 0; j < samples[i].size(); j ++)
        {
            std::cout << samples[i][j];
        }
        std::cout << std::endl;
    }


    for(int i: data)
    {
        std::cout << i;
    }
    std::cout << std::endl;*/
    return data;
}
