﻿#include <Windows.h>
#include <string>

#include "DxLib.h"

#include "ImageManager.h"

namespace
{
    // 識別子と実行フォルダから見た画像パスの対応表
    struct ImageDefinition
    {
        ImageId id;
        const wchar_t* path;
    };

    constexpr ImageDefinition imageDefinitions[] =
    {
        { ImageId::Player, L"Assets/Images/Player.png" },
        { ImageId::Tile, L"Assets/Images/Tile.png" },
        { ImageId::Goal, L"Assets/Images/Goal.png" }
    };

    static_assert(
        sizeof(imageDefinitions) / sizeof(imageDefinitions[0]) ==
        static_cast<std::size_t>(ImageId::Count));
}

ImageManager::ImageManager()
{
}

ImageManager::~ImageManager()
{
    Release();
}

bool ImageManager::LoadAll()
{
    // 再読み込み時にも古いハンドルを残さない
    Release();

    for (const ImageDefinition& definition : imageDefinitions)
    {
        const std::size_t index = static_cast<std::size_t>(definition.id);
        ImageResource& resource = resources[index];
        resource.handle = LoadGraph(definition.path);

        if (resource.handle == -1 ||
            GetGraphSize(resource.handle, &resource.width,
                &resource.height) == -1)
        {
            // 失敗したファイル名を示し、途中まで読み込んだ画像も解放する
            std::wstring message = definition.path;
            message += L" の読み込みまたはサイズ取得に失敗しました。";
            MessageBoxW(nullptr, message.c_str(), L"Asset Load Error", MB_OK);
            Release();
            return false;
        }
    }

    return true;
}

const ImageResource& ImageManager::Get(ImageId id) const
{
    return resources[static_cast<std::size_t>(id)];
}

void ImageManager::Release()
{
    for (ImageResource& resource : resources)
    {
        if (resource.handle != -1)
        {
            DeleteGraph(resource.handle);
        }

        // 解放後のハンドルとサイズを初期値へ戻す
        resource = {};
    }
}
