#ifndef _RIVE_ARTBOARD_BASE_HPP_
#define _RIVE_ARTBOARD_BASE_HPP_
#include "rive/core/field_types/core_bool_type.hpp"
#include "rive/core/field_types/core_double_type.hpp"
#include "rive/core/field_types/core_uint_type.hpp"
#include "rive/world_transform_component.hpp"
namespace rive {
    class ArtboardBase : public WorldTransformComponent {
    protected:
        typedef WorldTransformComponent Super;

    public:
        static const uint16_t typeKey = 1;

        /// Helper to quickly determine if a core object extends another without RTTI
        /// at runtime.
        bool isTypeOf(uint16_t typeKey) const override {
            switch (typeKey) {
                case ArtboardBase::typeKey:
                case WorldTransformComponentBase::typeKey:
                case ContainerComponentBase::typeKey:
                case ComponentBase::typeKey:
                    return true;
                default:
                    return false;
            }
        }

        uint16_t coreType() const override { return typeKey; }

        static const uint16_t clipPropertyKey = 196;
        static const uint16_t widthPropertyKey = 7;
        static const uint16_t heightPropertyKey = 8;
        static const uint16_t xPropertyKey = 9;
        static const uint16_t yPropertyKey = 10;
        static const uint16_t originXPropertyKey = 11;
        static const uint16_t originYPropertyKey = 12;
        static const uint16_t defaultStateMachineIdPropertyKey = 236;

    private:
        bool m_Clip = true;
        float m_Width = 0.0f;
        float m_Height = 0.0f;
        float m_X = 0.0f;
        float m_Y = 0.0f;
        float m_OriginX = 0.0f;
        float m_OriginY = 0.0f;
        uint32_t m_DefaultStateMachineId = -1;

    public:
        inline bool clip() const { return m_Clip; }
        void clip(bool value) {
            if (m_Clip == value) {
                return;
            }
            m_Clip = value;
            clipChanged();
        }

        inline float width() const { return m_Width; }
        void width(float value) {
            if (m_Width == value) {
                return;
            }
            m_Width = value;
            widthChanged();
        }

        inline float height() const { return m_Height; }
        void height(float value) {
            if (m_Height == value) {
                return;
            }
            m_Height = value;
            heightChanged();
        }

        inline float x() const { return m_X; }
        void x(float value) {
            if (m_X == value) {
                return;
            }
            m_X = value;
            xChanged();
        }

        inline float y() const { return m_Y; }
        void y(float value) {
            if (m_Y == value) {
                return;
            }
            m_Y = value;
            yChanged();
        }

        inline float originX() const { return m_OriginX; }
        void originX(float value) {
            if (m_OriginX == value) {
                return;
            }
            m_OriginX = value;
            originXChanged();
        }

        inline float originY() const { return m_OriginY; }
        void originY(float value) {
            if (m_OriginY == value) {
                return;
            }
            m_OriginY = value;
            originYChanged();
        }

        inline uint32_t defaultStateMachineId() const { return m_DefaultStateMachineId; }
        void defaultStateMachineId(uint32_t value) {
            if (m_DefaultStateMachineId == value) {
                return;
            }
            m_DefaultStateMachineId = value;
            defaultStateMachineIdChanged();
        }

        Core* clone() const override;
        void copy(const ArtboardBase& object) {
            m_Clip = object.m_Clip;
            m_Width = object.m_Width;
            m_Height = object.m_Height;
            m_X = object.m_X;
            m_Y = object.m_Y;
            m_OriginX = object.m_OriginX;
            m_OriginY = object.m_OriginY;
            m_DefaultStateMachineId = object.m_DefaultStateMachineId;
            WorldTransformComponent::copy(object);
        }

        bool deserialize(uint16_t propertyKey, BinaryReader& reader) override {
            switch (propertyKey) {
                case clipPropertyKey:
                    m_Clip = CoreBoolType::deserialize(reader);
                    return true;
                case widthPropertyKey:
                    m_Width = CoreDoubleType::deserialize(reader);
                    return true;
                case heightPropertyKey:
                    m_Height = CoreDoubleType::deserialize(reader);
                    return true;
                case xPropertyKey:
                    m_X = CoreDoubleType::deserialize(reader);
                    return true;
                case yPropertyKey:
                    m_Y = CoreDoubleType::deserialize(reader);
                    return true;
                case originXPropertyKey:
                    m_OriginX = CoreDoubleType::deserialize(reader);
                    return true;
                case originYPropertyKey:
                    m_OriginY = CoreDoubleType::deserialize(reader);
                    return true;
                case defaultStateMachineIdPropertyKey:
                    m_DefaultStateMachineId = CoreUintType::deserialize(reader);
                    return true;
            }
            return WorldTransformComponent::deserialize(propertyKey, reader);
        }

    protected:
        virtual void clipChanged() {}
        virtual void widthChanged() {}
        virtual void heightChanged() {}
        virtual void xChanged() {}
        virtual void yChanged() {}
        virtual void originXChanged() {}
        virtual void originYChanged() {}
        virtual void defaultStateMachineIdChanged() {}
    };
} // namespace rive

#endif