#include "diff_output.h"

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

#include "compat.h"

static void ensure_header(diff_output_t *output) {
    if (output->archive_names[0] != NULL) {
        printf("--- %s\n", output->archive_names[0]);
        printf("+++ %s\n", output->archive_names[1]);
        output->archive_names[0] = NULL;
        output->archive_names[1] = NULL;
    }
}

void diff_output_init(diff_output_t *output, int verbose, char *const archive_names[]) {
    output->archive_names[0] = archive_names[0];
    output->archive_names[1] = archive_names[1];
    output->verbose = verbose;
    output->file_name = NULL;
    output->file_size = 0;
    output->file_crc = 0;
}

void diff_output_start_file(diff_output_t *output, const char *name, zip_uint64_t size, zip_uint32_t crc) {
    output->file_name = name;
    output->file_size = size;
    output->file_crc = crc;
}

void diff_output_end_file(diff_output_t *output) {
    output->file_name = NULL;
}

void diff_output(diff_output_t *output, int side, const char *fmt, ...) {
    va_list ap;

    if (!output->verbose) {
        return;
    }

    ensure_header(output);
    
    if (output->file_name != NULL) {
        diff_output_file(output, ' ', output->file_name, output->file_size, output->file_crc);
        output->file_name = NULL;
    }
    
    printf("%c ", side);
    va_start(ap, fmt);
    vprintf(fmt, ap);
    va_end(ap);
    printf("\n");
}

void diff_output_file(diff_output_t *output, char side, const char *name, zip_uint64_t size, zip_uint32_t crc) {
    if (!output->verbose) {
        return;
    }
    
    ensure_header(output);
    
    printf("%c file '%s', size %" PRIu64 ", crc %08x\n", side, name, size, crc);
}

#define MAX_BYTES 64
void diff_output_data(diff_output_t *output, int side, const zip_uint8_t *data, zip_uint64_t data_length, const char *fmt, ...) {
    char hexdata[MAX_BYTES * 3 + 6];
    size_t i, offset;
    va_list ap;
    char *prefix;

    if (!output->verbose) {
        return;
    }
    
    offset = 0;
    for (i = 0; i < data_length; i++) {
        hexdata[offset++] = (i == 0 ? '<' : ' ');

        if (i >= MAX_BYTES) {
            sprintf(hexdata + offset, "...");
            break;
        }
        sprintf(hexdata + offset, "%02x", data[i]);
        offset += 2;
    }

    hexdata[offset++] = '>';
    hexdata[offset] = '\0';
    
    va_start(ap, fmt);
    vasprintf(&prefix, fmt, ap);
    va_end(ap);
    
    diff_output(output, side, "%s, length %" PRIu64 ", data %s", prefix, data_length, hexdata);
    
    free(prefix);
}
