#pragma once
#include "nlohmann/json.hpp"

using json = nlohmann::json;

class ShapeStats
{
public:
    double maxX;
    double maxY;
    double maxZ;
    double minX;
    double minY;
    double minZ;
    
    // center, length, area and volume not used yet!
    double centerX;
    double centerY;
    double centerZ;

    double length;
    double area;
    double volume;
    double axiVolume;

    ShapeStats()
    {
        maxX = 0.0;
        maxY = 0.0;
        maxZ = 0.0;
        minX = 0.0;
        minY = 0.0;
        minZ = 0.0;
        centerX = 0.0;
        centerY = 0.0;
        centerZ = 0.0;

        length = 0;
        area = 0;
        volume = 0;
        axiVolume = 0;
    };

    bool isEqual(const ShapeStats& other)
    {
        if (maxX != other.maxX) return false;
        if (maxY != other.maxY) return false;
        if (maxZ != other.maxZ) return false;
        if (minX != other.minX) return false;
        if (minY != other.minY) return false;
        if (minZ != other.minZ) return false;
        if (centerX != other.centerX) return false;
        if (centerY != other.centerY) return false;
        if (centerZ != other.centerZ) return false;
        if (length != other.length) return false;
        if (area != other.area) return false;
        if (volume != other.volume) return false;
        if (axiVolume != other.axiVolume) return false;
        return true;
    }

    json getJson()
    {
        json stat_json;
        stat_json["lengthX"] = maxX - minX;
        stat_json["lengthY"] = maxY - minY;
        stat_json["lengthZ"] = maxZ - minZ;
        stat_json["maxX"] = maxX;
        stat_json["maxY"] = maxY;
        stat_json["maxZ"] = maxZ;
        stat_json["minX"] = minX;
        stat_json["minY"] = minY;
        stat_json["minZ"] = minZ;
        return stat_json;
    }

    ShapeStats operator + (const ShapeStats& obj)
    {
        ShapeStats stat_json;
        if (obj.minX < minX)
            stat_json.minX = obj.minX;
        else
            stat_json.minX = minX;

        if (obj.minY < minY)
            stat_json.minY = obj.minY;
        else
            stat_json.minX = minX;

        if (obj.minZ < minZ)
            stat_json.minZ = obj.minZ;
        else
            stat_json.minZ = minZ;

        if (obj.maxX > maxX)
            stat_json.maxX = obj.maxX;
        else
            stat_json.maxX = maxX;

        if (obj.maxY > maxY)
            stat_json.maxY = obj.maxY;
        else
            stat_json.maxY = maxY;

        if (obj.maxZ > maxZ)
            stat_json.maxY = obj.maxY;
        else
            stat_json.maxY = maxY;

        return stat_json;
    }
};