/main/play.c
#include <string.h>
#include <sys/time.h>

#include "freertos/FreeRTOS.h"
#include "esp_log.h"
#include "cwalk.h"

#include "browse.h"
#include "bt.h"
#include "flac.h"
#include "gfx.h"
#include "keyboard.h"
#include "play.h"

play_media_type_t media_type = PLAY_MEDIA_NONE;
TaskHandle_t play_task;

void play_set_media_type(play_media_type_t t) {
	media_type = t;
}

play_state_t get_play_state() {
	switch (media_type) {
	case PLAY_MEDIA_BLUETOOTH:
		return (play_state_t) bt_get_playback_state()->state;
	default:
		ESP_LOGE("PLAY", "Unfinished media type: %d", media_type);
		return PLAY_STATE_ERROR;
	}
}

void play_send_command(play_command_t c) {
	switch (media_type) {
		case PLAY_MEDIA_BLUETOOTH: {
			esp_avrc_pt_cmd_t button;
			switch (c) {
			case PLAY_COMMAND_STOP:
				button = ESP_AVRC_PT_CMD_STOP;
				break;
			case PLAY_COMMAND_PLAY:
				button = ESP_AVRC_PT_CMD_PLAY;
				break;
			case PLAY_COMMAND_PAUSE:
				button = ESP_AVRC_PT_CMD_PAUSE;
				break;
			case PLAY_COMMAND_RTRK:
				button = ESP_AVRC_PT_CMD_BACKWARD;
				break;
			case PLAY_COMMAND_FTRK:
				button = ESP_AVRC_PT_CMD_FORWARD;
				break;
			case PLAY_COMMAND_RREV:
				button = ESP_AVRC_PT_CMD_REWIND;
				break;
			case PLAY_COMMAND_FFWD:
				button = ESP_AVRC_PT_CMD_FAST_FORWARD;
				break;
			default:
				return;
			}
			bt_send_key(button, ESP_AVRC_PT_CMD_STATE_PRESSED);
			bt_send_key(button, ESP_AVRC_PT_CMD_STATE_RELEASED);

			break;
		}
		default:
			ESP_LOGE("PLAY", "Unfinished media type: %d", media_type);
	}
}

void play_controller() {
	key_event_t ke;

	while (ke = key_get_event(0), !(ke.type == KEY_PRESSED && ke.code == KEY_BAND)) {
		play_state_t ps = get_play_state();
		if (ke.type == KEY_PRESSED) {
			switch (ke.code) {
			case KEY_SNOOZE:
				if (ps == PLAY_STATE_PLAYING) {
					play_send_command(PLAY_COMMAND_PAUSE);
				} else {
					play_send_command(PLAY_COMMAND_PLAY);
				}
				break;
			case KEY_1:
				play_send_command(PLAY_COMMAND_RTRK);
				break;
			case KEY_2:
				play_send_command(PLAY_COMMAND_RREV);
				break;
			case KEY_3:
				if (ps == PLAY_STATE_PLAYING) {
					play_send_command(PLAY_COMMAND_PAUSE);
				} else {
					play_send_command(PLAY_COMMAND_PLAY);
				}
				break;
			case KEY_4:
				play_send_command(PLAY_COMMAND_FFWD);
				break;
			case KEY_5:
				play_send_command(PLAY_COMMAND_FTRK);
				break;
			default:
				break;
			}
		}

		gfx_data_t* gd = gfx_acquire_data(SCENE_PLAY);
		gd->play.play_state = ps;
		gfx_release_data();

		vTaskDelay(50 / portTICK_PERIOD_MS);
	}
}

void play_start_file_type(const char* filename, file_type_t file_type) {
	play_parameters_t* pp = (play_parameters_t*) malloc(sizeof(play_parameters_t));
	strncpy(pp->filename, filename, FILENAME_MAX);

	switch (file_type) {
	case FILE_TYPE_FLAC:
		xTaskCreate(play_flac, "play_flac", 4096, pp, 1, &play_task);
		break;
	case FILE_TYPE_MP3:
		printf("MP3 Unimplemented");
		break;
	}
}

void play_file(const char* filename) {
	file_type_t file_type;
	const char* extension;
	size_t extension_len;
	cwk_path_get_extension(filename, &extension, &extension_len);
	if (strncmp(extension, ".flac", 6) == 0) {
		file_type = FILE_TYPE_FLAC;
	} else if (strncmp(extension, ".mp3", 5) == 0) {
		file_type = FILE_TYPE_MP3;
	} else {
		ESP_LOGE("play_file", "Could not play %s", filename);
		return;
	}

	printf("Playing %s\n", filename);
	play_start_file_type(filename, file_type);
}