#!/bin/env python3
import argparse
import os
import signal
import subprocess
import sys
import tempfile

if len(sys.argv) > 1 and sys.argv[1] == '--subproc':
    ramp_list = [' ', '▁', '▂', '▃', '▄', '▅', '▆', '▇', '█']
    ramp_list.extend(
        f'%{{F#{color.strip(" #")}}}█%{{F-}}'
        for color in sys.argv[2].split(',')
        if color
    )
    while True:
        cava_input = input().strip().split()
        cava_input = [int(i) for i in cava_input]
        output = ''
        for bar in cava_input:
            if bar < len(ramp_list):
                output += ramp_list[bar]

            else:
                output += ramp_list[-1]

        print(output)

parser = argparse.ArgumentParser()
parser.add_argument('-f', '--framerate', type=int, default=60,
                    help='Framerate to be used by cava, default is 60')
parser.add_argument('-b', '--bars', type=int, default=8,
                    help='Amount of bars, default is 8')
parser.add_argument('-e', '--extra_colors', default='',
                    help='Color gradient used on higher values, separated by commas, default is')
parser.add_argument('-c', '--channels', choices=['stereo', 'left', 'right', 'average'],
                    help='Audio channels to be used, defaults to stereo')

opts = parser.parse_args()
conf_channels = ''
if opts.channels != 'stereo':
    conf_channels = (
        'channels=mono\n'
       f'mono_option={opts.channels}'
    )

conf_ascii_max_range = 20

cava_conf = tempfile.mkstemp('','polybar-cava-conf.')[1]
with open(cava_conf, 'w') as cava_conf_file:
    cava_conf_file.write(
        '[general]\n'
       f'framerate={opts.framerate}\n'
       f'bars={opts.bars}\n'
        'autosense=1\n'
        'sensitivity=200\n'
        '[input]\n'
        'sample_rate=44100\n'
        '[output]\n'
        'method=raw\n'
        'data_format=ascii\n'
       f'ascii_max_range={conf_ascii_max_range}\n'
        'bar_delimiter=32'
        + conf_channels
    )

cava_proc = subprocess.Popen(['cava', '-p', cava_conf], stdout=subprocess.PIPE)
self_proc = subprocess.Popen(['python3', __file__, '--subproc', opts.extra_colors], stdin=cava_proc.stdout)

def cleanup(sig, frame):
    os.remove(cava_conf)
    cava_proc.kill()
    self_proc.kill()
    sys.exit(0)

signal.signal(signal.SIGTERM, cleanup)
signal.signal(signal.SIGINT,  cleanup)

self_proc.wait()