#ifndef URESIMP_H
#define URESIMP_H

#include "unicode/ures.h"

#include "unicode/uloc.h"
#include "unicode/ustring.h"
#include "cmemory.h"
#include "cstring.h"
#include "uresdata.h"
#include "uhash.h"
#include "umutex.h"

#define kRootLocaleName         "root"
#define kIndexLocaleName        "index"
#define kIndexTag               "InstalledLocales"

/*
 The default minor version and the version separator must be exactly one
 character long.
*/

#define kDefaultMinorVersion    "0"
#define kVersionSeparator       "."
#define kVersionTag             "Version"

#define MAGIC1 19700503
#define MAGIC2 19641227


enum UResEntryType {
    ENTRY_OK = 0,
    ENTRY_GOTO_ROOT = 1,
    ENTRY_GOTO_DEFAULT = 2,
    ENTRY_INVALID = 3
};

typedef enum UResEntryType UResEntryType;

struct UResourceDataEntry;
typedef struct UResourceDataEntry UResourceDataEntry;

struct UResourceDataEntry {
    char *fName; /* name of the locale for bundle - still to decide whether it is original or fallback */
    char *fPath; /* path to bundle - used for distinguishing between resources with the same name */
    uint32_t fCountExisting; /* how much is this resource used */
    ResourceData fData; /* data for low level access */
    UResourceDataEntry *fParent; /*next resource in fallback chain*/
    UResEntryType fStatus;
    UErrorCode fBogus;
    int32_t fHashKey; /* for faster access in the hashtable */
};

struct UResourceBundle {
    const char *fKey; /*tag*/
    char *fVersion;
    UBool fHasFallback;
    UBool fIsTopLevel;
    uint32_t fMagic1;
    uint32_t fMagic2;
    /*UBool fIsStackObject;*/
    UResourceDataEntry *fData; /*for low-level access*/
    int32_t fIndex;
    int32_t fSize;
    ResourceData fResData;
    Resource fRes;
};

U_CFUNC UResourceBundle* ures_openNoFallback(const char* path, const char* localeID, UErrorCode* status);
U_CFUNC const char* ures_getRealLocale(const UResourceBundle* resourceBundle, UErrorCode* status);
U_CAPI void ures_setIsStackObject( UResourceBundle* resB, UBool state);
U_CAPI UBool ures_isStackObject( UResourceBundle* resB, UErrorCode *status);

U_CFUNC const ResourceData *getFallbackData(const UResourceBundle* resBundle, const char* * resTag, UResourceDataEntry* *realData, Resource *res, UErrorCode *status);
U_CFUNC int32_t hashBundle(const void *parm);
U_CFUNC UBool compareBundles(const void *p1, const void *p2);

/* Candidates for export */
U_CFUNC UResourceBundle *copyResb(UResourceBundle *r, const UResourceBundle *original, UErrorCode *status);
U_CFUNC const ResourceData * ures_getResData(const UResourceBundle* resB);
#endif /*URESIMP_H*/
