/*
 * annotator.c
 *
 *  Annotates an image file containg a piano music sheet with
 * the help of a human for use in the main program.
 *
 * Author: Dario Rodriguez <antartica@whereismybit.com>
 * Please see the file LICENSE.txt in the sources root directory
 */

#ifdef EMSCRIPTEN
#include <emscripten.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <signal.h>
#include "boxui.h"

#define DEFAULT_SCREENW 640
#define DEFAULT_SCREENH 480

typedef struct mydata_t {
        int flag_exit;
        boxui_t *boxui;
} mydata_t;

volatile int flag_sigint;
static void sigint(int n);
static int install_signal(int n,void (*f)(int));

mydata_t *mydata_init(void);
void mydata_free(mydata_t *mydata);
int main_loop_iteration(mydata_t *mydata);

int
main(int argc, char *argv[])
{
        mydata_t *mydata;
        if((mydata=mydata_init())==NULL) {
                DEBUG_FPRINTF((stderr,"Couldn't init\n"));
                return(-1); /* couldn't init */
        }
        flag_sigint=0;
        install_signal(SIGINT,sigint);
        while(flag_sigint==0 && mydata->flag_exit==0 && mydata->boxui!=NULL) {
#ifdef EMSCRIPTEN
                emscripten_set_main_loop_arg((void (*)(void *))main_loop_iteration,(void *) mydata,boxui_getfps(mydata->boxui),1);
#else
                main_loop_iteration(mydata);
#endif
        }
        mydata_free(mydata),mydata=NULL;
        return(0);
}

static int
install_signal(int n,void (*f)(int))
{
#ifndef LINUX
        return(-1);
#else
        struct sigaction sact;
        sact.sa_handler=f;
        sigemptyset(&sact.sa_mask);
        sact.sa_flags=0;
        return(sigaction(n,&sact,0));
#endif
}

static void
sigint(int n)
{
        flag_sigint++;
}

mydata_t *
mydata_init(void)
{
        boxui_t *boxui;
        mydata_t *mydata;
        char *p;
        if((mydata=malloc(sizeof(mydata_t)))==NULL)
                return(NULL);
        memset(mydata,0,sizeof(mydata_t));
        if((mydata->boxui=boxui=boxui_init("Presto! Sight-Reading - Annotator",DEFAULT_SCREENW,DEFAULT_SCREENH,0))==NULL
          || boxui_setuserptr(boxui,mydata)!=0) {
                mydata_free(mydata),mydata=NULL;
                return(NULL);
        }
        /* initial UI config */
        p=boxui_add(boxui,_F,_L,"label:.l","-text \"(Here goes the music sheet)\"");
        boxui_pack(boxui,_F,_L,p,"-side top -fill both -expand true");
        return(mydata);
}

void
mydata_free(mydata_t *mydata)
{
        boxui_t *boxui;
        if(mydata==NULL)
                return;
        if((boxui=mydata->boxui)!=NULL) {
                boxui_setuserptr(boxui,NULL);
                boxui_free(boxui),boxui=NULL,mydata->boxui=NULL;
        }
        free(mydata),mydata=NULL;
        return;
}

int
main_loop_iteration(mydata_t *mydata)
{
        boxui_t *boxui;
        SDL_Event event;
        int keycode,neww,newh;
        char *actionstr,*actionparams;
        if(mydata==NULL || (boxui=mydata->boxui)==NULL)
                return(-1);
        boxui_tick(boxui);
        boxui_refreshevents(boxui);
        while(boxui_getevent(boxui,&event)==0) {
                /* standard events */
                if(boxui_event_isquit(boxui,&event))
                        mydata->flag_exit=1;
                if(boxui_event_iskeydown(boxui,&event,&keycode) && keycode==SDLK_ESCAPE)
                        mydata->flag_exit=1;
                if(boxui_event_isresize(boxui,&event,&neww,&newh))
                        boxui_resize(boxui,neww,newh);
        }
        while((actionstr=boxui_getactionstr(boxui,&actionparams))!=NULL) {
                if(strcmp(actionstr,"exit")==0)
                        mydata->flag_exit=1;
        }
        return(0);
}