#ifndef REDUMP_DAT_H_INCLUDED
#define REDUMP_DAT_H_INCLUDED

#include <stddef.h>
#include <stdint.h>

typedef enum {
    REDUMP_VERIFY_NOT_RUN = 0,
    REDUMP_VERIFY_MATCH,
    REDUMP_VERIFY_NO_MATCH,
    REDUMP_VERIFY_DAT_NOT_FOUND,
    REDUMP_VERIFY_DAT_READ_ERROR,
    REDUMP_VERIFY_INVALID_INPUT
} redump_verify_status;

typedef enum {
    REDUMP_FIELD_NOT_AVAILABLE = 0,
    REDUMP_FIELD_PASS,
    REDUMP_FIELD_FAIL
} redump_field_status;

typedef struct {
    redump_verify_status status;
    unsigned long entries_scanned;
    unsigned long exact_matches;
    unsigned long size_matches;
    unsigned long crc32_matches;
    unsigned long md5_matches;
    unsigned long sha1_matches;
    int candidate_available;
    int candidate_hash_matches;
    redump_field_status size_status;
    redump_field_status crc32_status;
    redump_field_status md5_status;
    redump_field_status sha1_status;
    char dat_path[512];
    char game_name[512];
    char rom_name[512];
    char expected_size[32];
    char expected_crc32[16];
    char expected_md5[40];
    char expected_sha1[48];
    char detail[256];
} redump_verify_result;

void redump_verify_result_init(redump_verify_result *result);
const char *redump_verify_status_string(redump_verify_status status);
const char *redump_field_status_string(redump_field_status status);
const char *redump_verify_overall_string(const redump_verify_result *result);
const char *redump_verify_confidence_string(const redump_verify_result *result);
const char *redump_verify_match_kind_string(const redump_verify_result *result);
int redump_verify_dat_file(
    const char *dat_path,
    uint64_t image_size,
    const char *crc32,
    const char *md5,
    const char *sha1,
    redump_verify_result *result
);

#endif
