#pragma once
#ifdef _SWITCH_
#include <switch.h>
#endif
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include <SDL.h>
#include <map>

#include "Tool/Ifstream_NPK.h"
#include <zlib.h>

class Asset_ImagePack
{
public:
    struct NpkInfo
    {
        int Offset;
        int Length;
        std::string Path;
    };

    // PNG结构体
    struct ImgInfo
    {
        // 图片格式
        int Type;
        // 压缩类型
        int CmpType;
        // 宽度
        int Width;
        // 高度
        int Height;
        // 大小
        int Size;
        // Xpos
        int Xpos;
        // Ypos
        int Ypos;
        // 帧域X
        int FrameXpos;
        // 帧域Y
        int FrameYpos;
        // 偏移
        int Offset;
        // Png位图数据
        BYTE *PNGdata;
    };

    struct IMG // npk的img的结构体
    {
        std::string lpImgName; // img文件的路径
        int img_index;         // img文件在npk文件里的序号
        unsigned imgOffset;
        unsigned imgSize;
        std::string lpBelongsFile; // 这个img属于哪个npk文件
        int png_sum;               // 这个img文件有多少个 图片
        ImgInfo *lp_lplist;        // 图片的数组..
        Uint32 UseTime = 0;
    };

public:
    Asset_ImagePack(const Asset_ImagePack &) = delete;
    Asset_ImagePack &operator=(const Asset_ImagePack &) = delete;
    Asset_ImagePack(Asset_ImagePack &&) = delete;
    Asset_ImagePack &operator=(Asset_ImagePack &&) = delete;
    // 全局访问点
    static Asset_ImagePack &GetInstance()
    {
        static Asset_ImagePack instance; // 局部静态变量，保证只初始化一次
        return instance;
    }

public:
    void Init();
    void ParseColor(BYTE *Tab, int Type, BYTE *SaveByte, int Offset);
    void LoadImgToMem(IMG *p);
    IMG *GetIMG(std::string imgName);

private:
    Asset_ImagePack(/* args */);
    ~Asset_ImagePack();

    std::map<std::string, IMG> map_npk;
};
