# Archival recorder source associated with Truth Beam session 1682718815.
# Public-release redaction: the original hard-coded RSK signing private key
# was replaced by the environment lookup below. All recording, hashing,
# projection, capture, chain-log, and anchoring logic is otherwise unchanged.
# Original archived file SHA-256:
# 432f08d7a44850c1be3f682eb24e83e0469f3079de48eed546c1345b51969123

import subprocess
from brownie import *
import gxipy as gx
from PIL import Image
import numpy
import cv2
import _thread
import threading
import time
import sys
from glob import glob
import os
import random
from queue import Queue
from fullscreen import FullScreen
from blake3 import blake3
import tensorflow as tf

def emission_from_hash(input_hash):
    output_hash = blake3(input_hash.encode('utf-8')).hexdigest(length=1536)
    i = 0
    complex_array = []
    while i < len(output_hash):
        complex_array.append(complex(int(output_hash[i : i + 2], 16), int(output_hash[i+2 : i + 4], 16)))
        i = i + 4  
    emission = 512*cv2.resize(numpy.abs(tf.signal.ifft3d(tf.signal.ifft3d(numpy.reshape(complex_array, (16,16,3))))), (1024, 1024))
    return emission

max_interval = 777

screen = FullScreen(backend="cv2")

p = project.load('token', name="TokenProject")
p.load_config()
from brownie.project.TokenProject import *
network.connect('rskMainnetPublic')
acct = accounts.add(os.environ["TRUTHBEAM_RSK_PRIVATE_KEY"])

print("ACCOUNT ADDRESS:")
print(accounts[0].address)

eth_block = str(subprocess.check_output(['bash', 'get_ethBlock.sh']))
emission_hash = old_block_hash = eth_block[64:130]

while emission_hash == old_block_hash:
    eth_block = str(subprocess.check_output(['bash', 'get_ethBlock.sh']))
    emission_hash = eth_block[64:130]

start_time = str(int(time.time()))
root_dir = "datasets/" + start_time
reports_dir = root_dir + "/reports/"
os.makedirs(reports_dir)
emissions_dir = root_dir + "/emissions/"
os.makedirs(emissions_dir)
agent_dir = root_dir + "/agent_data/"
os.makedirs(agent_dir)
agent_file = open(agent_dir + 'agent_data', 'a')

q = Queue(maxsize=1)
m_gLiveFlag = 1
m_gProcessFlag = 1

# create a device manager
device_manager = gx.DeviceManager()
dev_num, dev_info_list = device_manager.update_device_list()
# open the first device
cam = device_manager.open_device_by_index(1)
cam.TriggerMode.set(gx.GxSwitchEntry.OFF)
cam.ExposureAuto.set(0)
# set exposure
cam.ExposureTime.set(16660.0)
# set auto exposure time
#cam.ExposureAuto.set(1)
# set auto white balance
cam.BalanceWhiteAuto.set(1)
# set gain
cam.Gain.set(1.0)
# get param of improving image quality
if cam.GammaParam.is_readable():
    gamma_value = cam.GammaParam.get()
    gamma_lut = gx.Utility.get_gamma_lut(gamma_value)
else:
    gamma_lut = None
if cam.ContrastParam.is_readable():
    contrast_value = cam.ContrastParam.get()
    contrast_lut = gx.Utility.get_contrast_lut(contrast_value)
else:
    contrast_lut = None
if cam.ColorCorrectionParam.is_readable():
    color_correction_param = cam.ColorCorrectionParam.get()
else:
    color_correction_param = 0
# set the acq buffer count
cam.data_stream[0].set_acquisition_buffer_number(1)
# start data acquisition
cam.stream_on()

interval = 1

while interval < max_interval  + 1:
    emission = emission_from_hash(emission_hash)
    emission_filename = str(interval).zfill(6) + "_" + emission_hash
    
    numpy.save(emissions_dir + emission_filename, emission)
    cv2.imwrite("emission_buffer.png", emission)
    emission = cv2.imread("emission_buffer.png")
    emission = cv2.resize(emission, (1920,1200))
    screen.imshow(emission)
    for _ in range(12):
        raw_image = cam.data_stream[0].get_image()
    if (raw_image == None) or (raw_image.get_status() == gx.GxFrameStatusList.INCOMPLETE):
        print("Getting image failed.")
    else:
        rgb_image = raw_image.convert("RGB")
        rgb_image.image_improvement(color_correction_param, contrast_lut, gamma_lut)
        numpy_image = rgb_image.get_numpy_array()

    report_hash = blake3(numpy_image).hexdigest()
    numpy.save(reports_dir + str(interval).zfill(6) + "_" + report_hash, numpy.asarray(numpy_image))
    combined_hashes = str(interval).zfill(6) + '_E_' +  str(emission_hash) + '_R_' + str(report_hash)
    emission_hash = blake3(combined_hashes.encode('utf-8')).hexdigest()
    agent_file.write(combined_hashes + '\n')

    print("Interval: " + str(interval))
    interval = interval + 1

agent_file.write(str(interval) + '_E_' +  str(emission_hash) + '\n')
agent_file.close()
t = Token.deploy("Truth_Beam_PoliePals_Trailer", str(emission_hash), 18, 42e22, {'from': acct})
t.transfer('0x7e272d3f5037889adafe5edfb34c86d99e0ca290', 42e22, {'from': accounts[0]})
