#pragma once
#include <vector>
#include <string>
#include <variant>
#include <unordered_map>
#include <SDL.h>
#include "Tool/Blob.hpp"
#include "Tool/Tool_String.h"
#include "Tool/Common.h"

class ScriptData;
namespace AniScriptParser
{
    using AniFlag = std::variant<
        int,
        float,
        VecPos,
        Vec2,
        std::string,
        std::vector<int>,
        std::vector<float>>;
    struct AniFrame
    {
        std::string Img_Path;                          // img路径
        int Img_Index;                                 // img索引
        VecPos Img_Pos;                                // img位置
        std::vector<std::vector<int>> AttackBox;       // 攻击框
        std::vector<std::vector<int>> DamageBox;       // 受击框
        std::unordered_map<std::string, AniFlag> Flag; // Frame特效数据
        int Delay;                                     // 延迟
    };
    struct AniInfo
    {
        std::vector<std::string> Img_List;             // img列表
        std::vector<AniFrame> Frame;                   // ani列表
        std::unordered_map<std::string, AniFlag> Flag; // ani特效数据
    };

    struct AlsAniInfo
    {
        std::string path;
        std::vector<int> layer;
    };
    struct AlsInfo
    {
        std::unordered_map<std::string, AlsAniInfo> AniList; // Ani列表
    };

    // 工具函数
    std::string Get_Ani_Flag(int data);
    std::string Get_Ani_Effect_Type(int data);
    std::string Get_Ani_Flip_Type(int data);
    std::string Get_Ani_Damage_Type(int data);

    // Ani脚本的读取逻辑
    AniInfo StructAniInfo(Blob blob);
    AlsInfo StructAlsInfo(ScriptData &blob);
};