#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);

/*
 * Resolve a DAT path predictably.
 *
 * Resolution order:
 *   1. explicit_dir, when non-empty;
 *   2. executable_dir/redump_dat;
 *   3. current-working-directory redump_dat.
 *
 * The selected candidate is always written to out_path when arguments are
 * valid. The return value is nonzero only when that candidate exists.
 */
int redump_resolve_dat_path(
    const char *explicit_dir,
    const char *executable_dir,
    const char *basename,
    char *out_path,
    size_t out_path_size
);

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
