/**
 * @file miiimg.h
 * @brief Mii image (miiimg) service IPC wrapper.
 * @author XorTroll
 * @copyright libnx Authors
 */
#pragma once
#include "../types.h"
#include "../sf/service.h"
#include "../services/mii.h"

/// Image ID.
typedef struct {
    Uuid uuid;
} MiiimgImageId;

/// Image attribute.
typedef struct {
    MiiimgImageId image_id;    ///< Image ID.
    MiiCreateId create_id;     ///< Mii's create ID.
    u32 unk;
    u16 mii_name[10+1];        ///< utf-16be, null-terminated
} PACKED MiiimgImageAttribute;

/// Initialize miiimg.
Result miiimgInitialize(void);

/// Exit miiimg.
void miiimgExit(void);

/// Gets the Service object for the actual miiimg service session.
Service* miiimgGetServiceSession(void);

/**
 * @brief Reloads the image database.
 */
Result miiimgReload(void);

/**
 * @brief Gets the number of mii images in the database.
 * @param[out] out_count Mii image count.
 */
Result miiimgGetCount(s32 *out_count);

/**
 * @brief Gets whether the image database is empty.
 * @param[out] out_empty Whether the database is empty.
 */
Result miiimgIsEmpty(bool *out_empty);

/**
 * @brief Gets whether the image database is full.
 * @param[out] out_empty Whether the database is full.
 */
Result miiimgIsFull(bool *out_full);

/**
 * @brief Gets the image attribute for the specified image index.
 * @param[in] index Image index.
 * @param[out] out_attr Out image attribute.
 */
Result miiimgGetAttribute(s32 index, MiiimgImageAttribute *out_attr);

/**
 * @brief Loads the image data (raw RGBA8) for the specified image ID.
 * @note Server doesn't seem to check the image buffer size, but 0x40000 is the optimal size.
 * @param[in] id Input image ID.
 * @param[out] out_image Out iamge buffer.
 * @param[in] out_image_size Out image buffer size.
 */
Result miiimgLoadImage(MiiimgImageId id, void* out_image, size_t out_image_size);