#ifndef _RIVE_PARAMETRIC_PATH_BASE_HPP_
#define _RIVE_PARAMETRIC_PATH_BASE_HPP_
#include "rive/core/field_types/core_double_type.hpp"
#include "rive/shapes/path.hpp"
namespace rive {
    class ParametricPathBase : public Path {
    protected:
        typedef Path Super;

    public:
        static const uint16_t typeKey = 15;

        /// Helper to quickly determine if a core object extends another without RTTI
        /// at runtime.
        bool isTypeOf(uint16_t typeKey) const override {
            switch (typeKey) {
                case ParametricPathBase::typeKey:
                case PathBase::typeKey:
                case NodeBase::typeKey:
                case TransformComponentBase::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 widthPropertyKey = 20;
        static const uint16_t heightPropertyKey = 21;
        static const uint16_t originXPropertyKey = 123;
        static const uint16_t originYPropertyKey = 124;

    private:
        float m_Width = 0.0f;
        float m_Height = 0.0f;
        float m_OriginX = 0.5f;
        float m_OriginY = 0.5f;

    public:
        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 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();
        }

        void copy(const ParametricPathBase& object) {
            m_Width = object.m_Width;
            m_Height = object.m_Height;
            m_OriginX = object.m_OriginX;
            m_OriginY = object.m_OriginY;
            Path::copy(object);
        }

        bool deserialize(uint16_t propertyKey, BinaryReader& reader) override {
            switch (propertyKey) {
                case widthPropertyKey:
                    m_Width = CoreDoubleType::deserialize(reader);
                    return true;
                case heightPropertyKey:
                    m_Height = CoreDoubleType::deserialize(reader);
                    return true;
                case originXPropertyKey:
                    m_OriginX = CoreDoubleType::deserialize(reader);
                    return true;
                case originYPropertyKey:
                    m_OriginY = CoreDoubleType::deserialize(reader);
                    return true;
            }
            return Path::deserialize(propertyKey, reader);
        }

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

#endif