import os
from multiprocessing import Manager, Process
import cv2
import imageio as io
import numpy as np
import logging


def start_file_worker():
    m = Manager()
    file_queue = m.Queue()
    saver_proc = Process(target=_file_worker, args=(file_queue,))
    saver_proc.start()
    return file_queue


def _make_parent_if_needed(file_name):
    parent_dir = os.path.dirname(file_name)
    if not os.path.exists(parent_dir):
        os.makedirs(parent_dir)


def _file_worker(file_queue):
    logging.debug('started file saver with PID:', os.getpid())
    data = file_queue.get(True)
    prepend_path = './'
    while data is not None:
        dat_type = data[0]
        if dat_type == 'path':
            prepend_path = data[1]
            if not os.path.exists(prepend_path):
                os.makedirs(prepend_path)
        elif dat_type == 'txt_file':
            save_path = '{}/{}'.format(prepend_path, data[1])
            _make_parent_if_needed(save_path)
            with open(save_path, 'w') as f:
                f.write(data[2])
                f.write('\n')
        elif dat_type == 'mov':
            save_path = '{}/{}'.format(prepend_path, data[1])
            _make_parent_if_needed(save_path)
            fps, frames = 4, data[2]
            if len(data) == 4:
                fps = data[3]
            writer = io.get_writer(save_path, fps=fps)
            [writer.append_data(f.astype(np.uint8)) for f in frames]
            writer.close()
        elif dat_type == 'img':
            save_path = '{}/{}'.format(prepend_path, data[1])
            _make_parent_if_needed(save_path)
            cv2.imwrite(save_path, data[2][:, :, ::-1])

        data = file_queue.get(True)
    return