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

#include "core.h"
#include "preview.h"

#define SLIDE_DURATION 1.0
#define TRANS_DURATION 3.0

#include <sys/time.h>
#define timer_t struct timeval
#define start_timer(timer) gettimeofday(&(timer), NULL)
double end_timer(const timer_t timer) {
    timer_t end;
    start_timer(end);
    return (end.tv_sec - timer.tv_sec) + 1.0E-6 * (end.tv_usec - timer.tv_usec);
}

int main(int argc, char *argv[]) {
    int argp;
    float t_total;
    unsigned char *outbuf;
    timer_t t0;
    float t;
    int frameno;

    output_width = 960;
    output_height = 540;

    for (argp = 1;  argp < argc;  ++argp) {
        slide_t* slide;
        char *end;
        unsigned long color = strtoul(argv[argp], &end, 16);
        if (*end) {
            slide = new_slide(argv[argp], NULL);
            if (!slide) return 1;
            slide->start.type = KT_AUTOANIM;
            slide->end.type = KT_AUTOANIM;
        } else {
            slide = new_slide(NULL, NULL);
            if (!slide) return 1;
            slide->background = color;
        }
        slide->duration = SLIDE_DURATION;
        if ((argp + 1) < argc) {
            slide = new_trans(NULL);
            if (!slide) return 1;
            slide->trans.duration = TRANS_DURATION;
            slide->trans.type = TRANS_CIRCULAR;
            slide->trans.map_band_size = 0.125f;
            slide->trans.map_curve = EC_SMOOTH;
            slide->trans.time_curve = EC_DECELERATE;
            slide->trans.map_invert = 1;
        }
    }

    t_total = finish_slide_setup();
    if (t_total < 0.01f) return 1;
    dump_slides();
    printf("total time: %.2fs\n", t_total);

    preview_init(output_width, output_height, 0);
    preview_title("test_core");
    frameno = 0;
    start_timer(t0);
    t = 0.0f;
    for (;  t < t_total;  t = (float) end_timer(t0)) {
        int res = render_frame(t, &outbuf);
        if (!res) return 1;
        printf("\rframeno=%d, t=%.2f, num=%d ", ++frameno, t, res);
        fflush(stdout);
        if (preview_update(outbuf) == PREVIEW_BREAK) break;
    }
    printf("\rrendered %d frames in %.2f seconds -> %.2f fps\n", frameno, t, frameno / t);
    preview_done();
    core_cleanup();
    return 0;
}
