#!/usr/bin/env python3

import argparse
import pathlib
import sys

ROOT = pathlib.Path('/etc/plasma')
FIFO = pathlib.Path('/tmp/plasma')


def Color(value):
    try:
        return int(value)
    except ValueError:
        return int(value, 16)


def get_patterns():
    return ROOT.glob('*.png')


def valid_patterns():
    for pattern in get_patterns():
        yield pattern.stem


def open_fifo(filename):
    if filename.exists():
        return open(filename, 'wb')
    else:
        raise RuntimeError(f"FIFO {filename} does not exit! Is plasma running?")


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('--install', type=pathlib.Path, help='Install an animation file')
    parser.add_argument('--list', action='store_true', help='List available animations')
    parser.add_argument('--colour', nargs=3, type=Color, help='Display an RGB colour (all values 0-255)')
    parser.add_argument('--fps', type=int, help='Set the update framerate')
    parser.add_argument('--brightness', type=float, help='Set the LED brightness')
    parser.add_argument('--pattern', type=str, help='Display an image-based aniamtion from /etc/plasma', choices=list(valid_patterns()))

    args = parser.parse_args()

    if args.list:
        print("Available patterns:")
        for pattern in get_patterns():
            print(f"{pattern.stem:30} {pattern}")
        sys.exit(0)

    if args.pattern:
        print(f"Setting pattern to {args.pattern}")
        with open_fifo(FIFO) as fifo:
            fifo.write(f"{args.pattern}\n".encode("utf-8"))
            fifo.flush()
        sys.exit(0)

    if args.colour:
        r, g, b = args.colour
        print(f"Setting colour to {r}, {g}, {b}")
        with open_fifo(FIFO) as fifo:
            fifo.write(f"{r} {g} {b}\n".encode("utf-8"))
            fifo.flush()
        sys.exit(0)

    if args.brightness is not None:
        brightness = args.brightness
        print(f"Setting brightness to {brightness}")
        with open_fifo(FIFO) as fifo:
            fifo.write(f"brightness {brightness}\n".encode("utf-8"))
            fifo.flush()
        sys.exit(0)

    parser.print_help()
    sys.exit(1)
