/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the Collabora Office project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 */

#pragma once

#include "scdllapi.h"
#include <docmodel/color/ComplexColor.hxx>
#include <optional>
#include <o3tl/cow_wrapper.hxx>

namespace sc
{
/** Supported sparkline types */
enum class SparklineType
{
    Line,
    Column,
    Stacked
};

/** The method of calculating the axis min or max value */
enum class AxisType
{
    Individual, // calculate the min/max of a sparkline
    Group, // calculate the min or max of the whole sparkline group
    Custom // user defined
};

/** Determines how to display the empty cells */
enum class DisplayEmptyCellsAs
{
    Span,
    Gap,
    Zero // empty cell equals zero
};

/** Common properties for a group of sparklines */
class SC_DLLPUBLIC SparklineAttributes
{
private:
    class Implementation;
    o3tl::cow_wrapper<Implementation> m_aImplementation;

public:
    SparklineAttributes();
    ~SparklineAttributes();
    SparklineAttributes(const SparklineAttributes& rOther);
    SparklineAttributes(SparklineAttributes&& rOther);
    SparklineAttributes& operator=(const SparklineAttributes& rOther);
    SparklineAttributes& operator=(SparklineAttributes&& rOther);

    bool operator==(const SparklineAttributes& rOther) const;
    bool operator!=(const SparklineAttributes& rOther) const
    {
        return !(SparklineAttributes::operator==(rOther));
    }

    void resetColors();

    const model::ComplexColor& getColorSeries() const;
    void setColorSeries(model::ComplexColor const& rColorSeries);

    const model::ComplexColor& getColorNegative() const;
    void setColorNegative(model::ComplexColor const& rColorSeries);

    const model::ComplexColor& getColorAxis() const;
    void setColorAxis(model::ComplexColor const& rColorSeries);

    const model::ComplexColor& getColorMarkers() const;
    void setColorMarkers(model::ComplexColor const& rColorSeries);

    const model::ComplexColor& getColorFirst() const;
    void setColorFirst(model::ComplexColor const& rColorSeries);

    const model::ComplexColor& getColorLast() const;
    void setColorLast(model::ComplexColor const& rColorSeries);

    const model::ComplexColor& getColorHigh() const;
    void setColorHigh(model::ComplexColor const& rColorSeries);

    const model::ComplexColor& getColorLow() const;
    void setColorLow(model::ComplexColor const& rColorSeries);

    AxisType getMinAxisType() const;
    void setMinAxisType(AxisType eAxisType);

    AxisType getMaxAxisType() const;
    void setMaxAxisType(AxisType eAxisType);

    /** Line weight or width in points */
    double getLineWeight() const;
    void setLineWeight(double nWeight);

    SparklineType getType() const;
    void setType(SparklineType eType);

    bool isDateAxis() const;
    void setDateAxis(bool bValue);

    DisplayEmptyCellsAs getDisplayEmptyCellsAs() const;
    void setDisplayEmptyCellsAs(DisplayEmptyCellsAs eValue);

    bool isMarkers() const;
    void setMarkers(bool bValue);

    bool isHigh() const;
    void setHigh(bool bValue);

    bool isLow() const;
    void setLow(bool bValue);

    bool isFirst() const;
    void setFirst(bool bValue);

    bool isLast() const;
    void setLast(bool bValue);

    bool isNegative() const;
    void setNegative(bool bValue);

    bool shouldDisplayXAxis() const;
    void setDisplayXAxis(bool bValue);

    bool shouldDisplayHidden() const;
    void setDisplayHidden(bool bValue);

    bool isRightToLeft() const;
    void setRightToLeft(bool bValue);

    std::optional<double> getManualMax() const;
    void setManualMax(std::optional<double> aValue);

    std::optional<double> getManualMin() const;
    void setManualMin(std::optional<double> aValue);
};

} // end sc

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
