import numpy as np
from scipy.io.wavfile import write
import pandas as pd
import sys
import base64
import json
import io

K = 44100
T = 1

def generate_music_1(nums, filename, base=440 ):

    tmp = np.zeros(K - nums.shape[0] - base)
    nums = np.concatenate([np.zeros(base), nums, tmp])

    trans = np.fft.ifft(nums).real
    trans = np.int16(trans * 32767)

    trans = np.tile(trans, T)

    write(filename, K, trans)

def generate_music_2(nums, filename, base=440, step=10 ):

    for i in range(nums.shape[0], 0, -1):
        nums = np.insert(nums, i, [0] * step)

    tmp = np.zeros(K - nums.shape[0] - base)
    nums = np.concatenate([np.zeros(base), nums, tmp])

    trans = np.fft.ifft(nums).real
    trans = np.int16(trans * 32767)

    trans = np.tile(trans, T)

    write(filename, K, trans)
    
def generate_music_3(new, filename, base_key=55 ):
    
    nums = np.arange(K)

    for i in range(min(8, new.shape[0])):
        j = i + 1
        nums[base_key * (2 ** i)] = new[i].real

    trans = np.fft.ifft(nums).real
    trans = np.int16(trans * 32767)

    trans = np.tile(trans, T)

    write(filename, K, trans)
    
def convert(filehandler):
    enc = base64.b64encode(filehandler.read())
    return enc.decode()
    
# data = pd.read_csv("mir_Diffranksum.csv").astype("int").T

f = open("mir_Diffranksum.csv")
l = f.read().split()
# print(l[0])
jsondict = {}
for x in l:
    l = x.split(',')
    n = l[0]
    l = l[1:]
    l = list(filter(lambda a: a, l))
    df = pd.DataFrame(l).astype('int')
    df = (df - df.min()) / (df.max() - df.min())
    df = df * 10000

    jsondict[n] = {}
    
    for index in range(1,2):
        dfnp = np.array(df[0].values)
        functionname = "generate_music_" + str(index)
        filehandle = io.BytesIO()
        eval(functionname)(dfnp.astype('complex'), "audio" + str(index) + "/" + n + ".wav")
        # jsondict[n][index] = convert(filehandle)


# with open("mir.json", "w") as f:
#     f.write(json.dumps(jsondict))

    