#include "DataParser.h"

DRAGONBONES_NAMESPACE_BEGIN

const char* DataParser::DATA_VERSION_2_3 = "2.3";
const char* DataParser::DATA_VERSION_3_0 = "3.0";
const char* DataParser::DATA_VERSION_4_0 = "4.0";
const char* DataParser::DATA_VERSION_4_5 = "4.5";
const char* DataParser::DATA_VERSION_5_0 = "5.0";
const char* DataParser::DATA_VERSION_5_5 = "5.5";
const char* DataParser::DATA_VERSION = DataParser::DATA_VERSION_5_5;

const std::vector<std::string> DataParser::DATA_VERSIONS{
    DataParser::DATA_VERSION_4_0,
    DataParser::DATA_VERSION_4_5,
    DataParser::DATA_VERSION_5_0,
    DataParser::DATA_VERSION_5_5};

const char* DataParser::TEXTURE_ATLAS = "TextureAtlas";
const char* DataParser::SUB_TEXTURE = "SubTexture";
const char* DataParser::FORMAT = "format";
const char* DataParser::IMAGE_PATH = "imagePath";
const char* DataParser::WIDTH = "width";
const char* DataParser::HEIGHT = "height";
const char* DataParser::ROTATED = "rotated";
const char* DataParser::FRAME_X = "frameX";
const char* DataParser::FRAME_Y = "frameY";
const char* DataParser::FRAME_WIDTH = "frameWidth";
const char* DataParser::FRAME_HEIGHT = "frameHeight";

const char* DataParser::DRADON_BONES = "dragonBones";
const char* DataParser::USER_DATA = "userData";
const char* DataParser::ARMATURE = "armature";
const char* DataParser::BONE = "bone";
const char* DataParser::SLOT = "slot";
const char* DataParser::CONSTRAINT = "constraint";
const char* DataParser::IK = "ik";
const char* DataParser::SKIN = "skin";
const char* DataParser::DISPLAY = "display";
const char* DataParser::ANIMATION = "animation";
const char* DataParser::Z_ORDER = "zOrder";
const char* DataParser::FFD = "ffd";
const char* DataParser::FRAME = "frame";
const char* DataParser::TRANSLATE_FRAME = "translateFrame";
const char* DataParser::ROTATE_FRAME = "rotateFrame";
const char* DataParser::SCALE_FRAME = "scaleFrame";
const char* DataParser::DISPLAY_FRAME = "displayFrame";
const char* DataParser::COLOR_FRAME = "colorFrame";
const char* DataParser::DEFAULT_ACTIONS = "defaultActions";
const char* DataParser::ACTIONS = "actions";
const char* DataParser::EVENTS = "events";
const char* DataParser::INTS = "ints";
const char* DataParser::FLOATS = "floats";
const char* DataParser::STRINGS = "strings";
const char* DataParser::CANVAS = "canvas";

const char* DataParser::TRANSFORM = "transform";
const char* DataParser::PIVOT = "pivot";
const char* DataParser::AABB = "aabb";
const char* DataParser::COLOR = "color";

const char* DataParser::VERSION = "version";
const char* DataParser::COMPATIBLE_VERSION = "compatibleVersion";
const char* DataParser::FRAME_RATE = "frameRate";
const char* DataParser::TYPE = "type";
const char* DataParser::SUB_TYPE = "subType";
const char* DataParser::NAME = "name";
const char* DataParser::PARENT = "parent";
const char* DataParser::TARGET = "target";
const char* DataParser::STAGE = "stage";
const char* DataParser::SHARE = "share";
const char* DataParser::PATH = "path";
const char* DataParser::LENGTH = "length";
const char* DataParser::DISPLAY_INDEX = "displayIndex";
const char* DataParser::BLEND_MODE = "blendMode";
const char* DataParser::INHERIT_TRANSLATION = "inheritTranslation";
const char* DataParser::INHERIT_ROTATION = "inheritRotation";
const char* DataParser::INHERIT_SCALE = "inheritScale";
const char* DataParser::INHERIT_REFLECTION = "inheritReflection";
const char* DataParser::INHERIT_ANIMATION = "inheritAnimation";
const char* DataParser::INHERIT_DEFORM = "inheritDeform";
const char* DataParser::BEND_POSITIVE = "bendPositive";
const char* DataParser::CHAIN = "chain";
const char* DataParser::WEIGHT = "weight";

const char* DataParser::FADE_IN_TIME = "fadeInTime";
const char* DataParser::PLAY_TIMES = "playTimes";
const char* DataParser::SCALE = "scale";
const char* DataParser::OFFSET = "offset";
const char* DataParser::POSITION = "position";
const char* DataParser::DURATION = "duration";
const char* DataParser::TWEEN_EASING = "tweenEasing";
const char* DataParser::TWEEN_ROTATE = "tweenRotate";
const char* DataParser::TWEEN_SCALE = "tweenScale";
const char* DataParser::CLOCK_WISE = "clockwise";
const char* DataParser::CURVE = "curve";
const char* DataParser::EVENT = "event";
const char* DataParser::SOUND = "sound";
const char* DataParser::ACTION = "action";

const char* DataParser::X = "x";
const char* DataParser::Y = "y";
const char* DataParser::SKEW_X = "skX";
const char* DataParser::SKEW_Y = "skY";
const char* DataParser::SCALE_X = "scX";
const char* DataParser::SCALE_Y = "scY";
const char* DataParser::VALUE = "value";
const char* DataParser::ROTATE = "rotate";
const char* DataParser::SKEW = "skew";

const char* DataParser::ALPHA_OFFSET = "aO";
const char* DataParser::RED_OFFSET = "rO";
const char* DataParser::GREEN_OFFSET = "gO";
const char* DataParser::BLUE_OFFSET = "bO";
const char* DataParser::ALPHA_MULTIPLIER = "aM";
const char* DataParser::RED_MULTIPLIER = "rM";
const char* DataParser::GREEN_MULTIPLIER = "gM";
const char* DataParser::BLUE_MULTIPLIER = "bM";

const char* DataParser::UVS = "uvs";
const char* DataParser::VERTICES = "vertices";
const char* DataParser::TRIANGLES = "triangles";
const char* DataParser::WEIGHTS = "weights";
const char* DataParser::SLOT_POSE = "slotPose";
const char* DataParser::BONE_POSE = "bonePose";

const char* DataParser::GOTO_AND_PLAY = "gotoAndPlay";

const char* DataParser::DEFAULT_NAME = "default";

TextureFormat DataParser::_getTextureFormat(const std::string& value) {
    auto lower = value;
    std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);

    if (lower == "rgba8888") {
        return TextureFormat::RGBA8888;
    } else if (lower == "bgra8888") {
        return TextureFormat::BGRA8888;
    } else if (lower == "rgba4444") {
        return TextureFormat::RGBA4444;
    } else if (lower == "rgb888") {
        return TextureFormat::RGB888;
    } else if (lower == "rgb565") {
        return TextureFormat::RGB565;
    } else if (lower == "rgba5551") {
        return TextureFormat::RGBA5551;
    }

    return TextureFormat::DEFAULT;
}

ArmatureType DataParser::_getArmatureType(const std::string& value) {
    auto lower = value;
    std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);

    if (lower == "armature") {
        return ArmatureType::Armature;
    } else if (lower == "movieClip") {
        return ArmatureType::MovieClip;
    } else if (lower == "stage") {
        return ArmatureType::Stage;
    }

    return ArmatureType::Armature;
}

DisplayType DataParser::_getDisplayType(const std::string& value) {
    auto lower = value;
    std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);

    if (lower == "image") {
        return DisplayType::Image;
    } else if (lower == "armature") {
        return DisplayType::Armature;
    } else if (lower == "mesh") {
        return DisplayType::Mesh;
    } else if (lower == "boundingbox") {
        return DisplayType::BoundingBox;
    }

    return DisplayType::Image;
}

BoundingBoxType DataParser::_getBoundingBoxType(const std::string& value) {
    auto lower = value;
    std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);

    if (lower == "rectangle") {
        return BoundingBoxType::Rectangle;
    } else if (lower == "ellipse") {
        return BoundingBoxType::Ellipse;
    } else if (lower == "polygon") {
        return BoundingBoxType::Polygon;
    }

    return BoundingBoxType::Rectangle;
}

ActionType DataParser::_getActionType(const std::string& value) {
    auto lower = value;
    std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);

    if (lower == "play") {
        return ActionType::Play;
    } else if (lower == "frame") {
        return ActionType::Frame;
    } else if (lower == "sound") {
        return ActionType::Sound;
    }

    return ActionType::Play;
}

BlendMode DataParser::_getBlendMode(const std::string& value) {
    auto lower = value;
    std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);

    if (lower == "normal") {
        return BlendMode::Normal;
    } else if (lower == "add") {
        return BlendMode::Add;
    } else if (lower == "alpha") {
        return BlendMode::Alpha;
    } else if (lower == "darken") {
        return BlendMode::Darken;
    } else if (lower == "difference") {
        return BlendMode::Difference;
    } else if (lower == "erase") {
        return BlendMode::Erase;
    } else if (lower == "hardlight") {
        return BlendMode::HardLight;
    } else if (lower == "invert") {
        return BlendMode::Invert;
    } else if (lower == "layer") {
        return BlendMode::Layer;
    } else if (lower == "lighten") {
        return BlendMode::Lighten;
    } else if (lower == "multiply") {
        return BlendMode::Multiply;
    } else if (lower == "overlay") {
        return BlendMode::Overlay;
    } else if (lower == "screen") {
        return BlendMode::Screen;
    } else if (lower == "subtract") {
        return BlendMode::Subtract;
    }

    return BlendMode::Normal;
}

DRAGONBONES_NAMESPACE_END
