#pragma once

#include <windows.h>
#include <stdlib.h>
#include <vector>
#include <glm.hpp>
#include <QPainter>
#include "Constants.hpp"
#include "AlterableObjectTypes.hpp"

/*
   Class: AlterableObject

     *Abstract* class that implements the skeleton of an alterable object,
     i.e. each object which can be drawn and/or modified by the <TransitionManager>
     (charts, data elements, grid and axis lines, labels).
*/
class AlterableObject {
  public:
    /*
       Constructor: AlterableObject

         Unused constructor of abstract class.
    */
    AlterableObject();

    /*
       Destructor: ~AlterableObject

         *Virtual*. Releases all allocated resources.
    */
    virtual ~AlterableObject();


    /*
       Function: GetType

         Returns the type indicator of the class.

       Returns:

         The type indicator of the class.
    */
    int GetType();


    /*
       Function: Draw

         *Virtual*. Draws the object.

       Parameters:

         pPainter - The QPainter object that shall be used for painting.
    */
    virtual void Draw(QPainter* pPainter) = 0;

    /*
       Function: DrawLabels

         *Virtual*. Draws the labels assigned to the assigned object.

       Parameters:

         pPainter - The QPainter object that shall be used for painting.
    */
    virtual void DrawLabels(QPainter* pPainter) = 0;

    /*
       Function: ChangePosition

         *Virtual*. Changes the position of the object.

       Parameters:

         fDeltaLeft - Total horizontal distance.
         fDeltaTop - Total vertical distance according to the upper vertices.
         fDeltaBottom - Total vertical distance according to the lower vertices. Default value is 0.0f.
    */
    virtual void ChangePosition(float fDeltaLeft, float fDeltaTop, float fDeltaBottom = 0.0f) = 0;

    /*
       Function: ChangeAlpha

         *Virtual*. Changes the alpha value of the object.

       Parameters:

         fDeltaAlpha - Change of alpha value.
    */
    virtual void ChangeAlpha(float fDeltaAlpha) = 0;

  protected:
    int iType;
};