#!/usr/bin/env python3
import time
import sys
import random
from glob import glob
from pygame import mixer


tracks_per_type = 2
single_track_types = ["lines"]


def load_files():
    files = glob("samples/*.wav")
    type_names = glob("samples/*/")
    type_files = {c.split("/")[1]: glob(c + "/*.wav") for c in type_names}
    return type_files


def main():
    type_files = load_files()
    mixer.init(frequency=22050 * 2)
    types = {}
    i = 0
    mixer.set_num_channels(
        sum(
            [
                1 if name in single_track_types else tracks_per_type
                for name in type_files
            ]
        )
    )
    print(f"{mixer.get_num_channels()} channels set")
    for name in type_files:
        types[name] = []
        for k in range(1 if name in single_track_types else tracks_per_type):
            types[name].append(mixer.Channel(i))
            i += 1
    sounds = {}
    for name, files in type_files.items():
        sounds[name] = []
        for f in files:
            sounds[name].append(mixer.Sound(f))
        random.shuffle(sounds[name])
    try:
        while True:
            for name, type_ in types.items():
                if len(sounds[name]) == 0:
                    continue
                try:
                    next_sound_index = max(
                        [sounds[name].index(tt.get_queue() or tt.get_sound()) for tt in type_]
                    )
                except ValueError:
                    next_sound_index = 0
                if next_sound_index >= len(sounds[name]):
                    random.shuffle(sounds[name])
                    next_sound_index = 0
                for c in type_:
                    if c.get_queue() is not None and len(sounds[name]) > 1:
                        continue
                    c.queue(sounds[name][next_sound_index])
                    if c.get_queue() is None and len(sounds[name]) > 1:
                        c.queue(sounds[name][next_sound_index + 1])
            time.sleep(1)
    except KeyboardInterrupt:
        print("exit")
        sys.exit(0)


if __name__ == "__main__":
    main()
