#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

#include "mdns.h"
#include "nvs.h"
#include "tcpip_adapter.h"
#include "esp_log.h"
#include "esp_console.h"
#include "esp_pthread.h"
#include "esp_system.h"
#include "freertos/timers.h"
#include "nvs_utilities.h"
#include "raop.h"

#include "log_util.h"

#include "trace.h"

#ifndef CONFIG_AIRPLAY_NAME
#define CONFIG_AIRPLAY_NAME		"ESP32-AirPlay"
#endif

static const char * TAG = "platform";

log_level	raop_loglevel = lINFO;
log_level	util_loglevel;

static log_level *loglevel = &raop_loglevel;
static struct raop_ctx_s *raop;

/****************************************************************************************
 * Airplay sink de-initialization
 */
void raop_sink_deinit(void) {
	raop_delete(raop);
	mdns_free();
}	

/****************************************************************************************
 * Airplay sink initialization
 */
void raop_sink_init(raop_cmd_cb_t cmd_cb, raop_data_cb_t data_cb) {
    const char *hostname;
	char sink_name[64-6] = CONFIG_AIRPLAY_NAME;
	tcpip_adapter_ip_info_t ipInfo; 
	struct in_addr host;
   	
	// get various IP info
	tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_STA, &ipInfo);
	tcpip_adapter_get_hostname(TCPIP_ADAPTER_IF_STA, &hostname);
	host.s_addr = ipInfo.ip.addr;

    // initialize mDNS
    ESP_ERROR_CHECK( mdns_init() );
    ESP_ERROR_CHECK( mdns_hostname_set(hostname) );
        
    char * sink_name_buffer= (char *)config_alloc_get(NVS_TYPE_STR, "airplay_name");
    if(sink_name_buffer != NULL){
    	memset(sink_name, 0x00, sizeof(sink_name));
    	strncpy(sink_name,sink_name_buffer,sizeof(sink_name)-1 );
    	free(sink_name_buffer);
    }

	ESP_LOGI(TAG, "mdns hostname set to: [%s] with servicename %s", hostname, sink_name);

    // create RAOP instance, latency is set by controller
	uint8_t mac[6];	
    esp_read_mac(mac, ESP_MAC_WIFI_STA);
	raop = raop_create(host, sink_name, mac, 0, cmd_cb, data_cb);
}

/****************************************************************************************
 * Airplay local command (stop, start, volume ...)
 */
void raop_sink_cmd(raop_event_t event, void *param) {
	raop_cmd(raop, event, param);
}
