/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
/*
 * 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 <tools/color.hxx>
#include <cstdint>

/* All possible data needed to do the job outside mathml limits */
// Ml prefix means it is part of mathml standard
// NMl means it is not part of mathml standard but needed info to work

/* For now empty, don't know yet what's needed besides default font size. */
struct SmGlobalData
{
};

/* Mhtml length tools */
/*************************************************************************************************/

enum class SmLengthUnit : uint_fast8_t
{
    MlEm,
    MlEx,
    MlPx,
    MlIn,
    MlCm,
    MlMm,
    MlPt,
    MlPc,
    MlP, // Percent
    MlM // Multiplier
};

struct SmLengthValue
{
    SmLengthUnit m_aLengthUnit;
    double m_aLengthValue;
    // Keeps original text value to avoid numerical error data loss
    OUString* m_aOriginalText;
};

/* Possible mathml elements */
/*************************************************************************************************/

enum class SmMlElementType : uint_fast8_t
{
    // Used for base element. Means no information contained.
    NMlEmpty,
    // Used for structural dependencies. Means no information contained.
    NMlStructural,
    NMlSmNode,
    // Mathml real elements
    MlMath,
    MlMi,
    MlMerror,
    MlMn,
    MlMo,
    MlMrow,
    MlMtext,
    MlMstyle
};

/* Possible mathml attributes */
/*************************************************************************************************/

enum class SmMlAttributeValueType : uint_fast8_t
{
    NMlEmpty,
    MlAccent,
    MlDir,
    MlDisplaystyle,
    MlFence,
    MlForm,
    MlHref,
    MlLspace,
    MlMathbackground,
    MlMathcolor,
    MlMathsize,
    MlMathvariant,
    MlMaxsize,
    MlMinsize,
    MlMovablelimits,
    MlRspace,
    MlSeparator,
    MlStretchy,
    MlSymmetric
};

/* Possible values of mathml attributes */
/*************************************************************************************************/

enum class SmMlAttributeValueEmpty : uint_fast8_t
{
    MlEmpty = 0x00
};

enum class SmMlAttributeValueAccent : uint_fast8_t
{
    MlFalse = 0x00,
    MlTrue = 0x01
};

enum class SmMlAttributeValueDir : uint_fast8_t
{
    MlLtr = 0x00,
    MlRtl = 0x01
};

enum class SmMlAttributeValueDisplaystyle : uint_fast8_t
{
    MlFalse = 0x00,
    MlTrue = 0x01
};

enum class SmMlAttributeValueFence : uint_fast8_t
{
    MlFalse = 0x00,
    MlTrue = 0x01
};

enum class SmMlAttributeValueForm : uint_fast8_t
{
    MlPrefix = 0x01,
    MlInfix = 0x02,
    MlPosfix = 0x04
};

enum class SmMlAttributeValueHref : uint_fast8_t
{
    NMlEmpty = 0x00,
    NMlValid = 0x01
};

enum class SmMlAttributeValueLspace : uint_fast8_t
{
    NMlEmpty = 0x00
};

enum class SmMlAttributeValueMathbackground : uint_fast32_t
{
    MlTransparent = 0x00,
    MlRgb = 0x01
};

enum class SmMlAttributeValueMathcolor : uint_fast8_t
{
    MlDefault = 0x00,
    MlRgb = 0x01
};

enum class SmMlAttributeValueMathsize : uint_fast8_t
{
    NMlEmpty = 0x00,
};

enum class SmMlAttributeValueMathvariant : uint_fast16_t
{
    normal = 0x000,
    bold = 0x001,
    italic = 0x002,
    double_struck = 0x004,
    script = 0x008,
    fraktur = 0x010,
    sans_serif = 0x020,
    monospace = 0x040,
    bold_italic = 0x001 | 0x002,
    bold_fraktur = 0x001 | 0x010,
    bold_script = 0x001 | 0x008,
    bold_sans_serif = 0x001 | 0x020,
    sans_serif_italic = 0x002 | 0x20,
    sans_serif_bold_italic = 0x001 | 0x002 | 0x020,
    // Non english
    initial = 0x080,
    tailed = 0x100,
    looped = 0x200,
    stretched = 0x400
};

enum class SmMlAttributeValueMaxsize : uint_fast8_t
{
    MlInfinity = 0x00,
    MlFinite = 0x01
};

/*
 * Specifies whether attached under- and overscripts move to sub- and superscript positions when displaystyle is false.
 * Source: https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mo
 */
enum class SmMlAttributeValueMovablelimits : uint_fast8_t
{
    MlFalse = 0x00,
    MlTrue = 0x01
};

enum class SmMlAttributeValueRspace : uint_fast8_t
{
    NMlEmpty = 0x00
};

enum class SmMlAttributeValueSeparator : uint_fast8_t
{
    MlFalse = 0x00,
    MlTrue = 0x01
};

enum class SmMlAttributeValueStretchy : uint_fast8_t
{
    MlFalse = 0x00,
    MlTrue = 0x01
};

enum class SmMlAttributeValueSymmetric : uint_fast8_t
{
    MlFalse = 0x00,
    MlTrue = 0x01
};

/* Structures for all possible attributes */
/*************************************************************************************************/

struct SmMlAccent
{
    SmMlAttributeValueAccent m_aAccent;
};

struct SmMlDir
{
    SmMlAttributeValueDir m_aDir;
};

struct SmMlDisplaystyle
{
    SmMlAttributeValueDisplaystyle m_aDisplaystyle;
};

struct SmMlFence
{
    SmMlAttributeValueFence m_aFence;
};

struct SmMlForm
{
    SmMlAttributeValueForm m_aForm;
};

struct SmMlHref
{
    SmMlAttributeValueHref m_aHref;
    OUString* m_aLnk;
};

struct SmMlLspace
{
    SmLengthValue m_aLengthValue;
};

struct SmMlMathbackground
{
    SmMlAttributeValueMathbackground m_aMathbackground;
    Color m_aCol;
};

struct SmMlMathcolor
{
    SmMlAttributeValueMathcolor m_aMathcolor;
    Color m_aCol;
};

struct SmMlMathsize
{
    SmLengthValue m_aLengthValue;
};

struct SmMlMathvariant
{
    SmMlAttributeValueMathvariant m_aMathvariant;
};

struct SmMlMaxsize
{
    SmMlAttributeValueMaxsize m_aMaxsize;
    SmLengthValue m_aLengthValue;
};

struct SmMlMinsize
{
    SmLengthValue m_aLengthValue;
};

struct SmMlMovablelimits
{
    SmMlAttributeValueMovablelimits m_aMovablelimits;
};

struct SmMlRspace
{
    SmLengthValue m_aLengthValue;
};

struct SmMlSeparator
{
    SmMlAttributeValueSeparator m_aSeparator;
};

struct SmMlStretchy
{
    SmMlAttributeValueStretchy m_aStretchy;
};

struct SmMlSymmetric
{
    SmMlAttributeValueSymmetric m_aSymmetric;
};

/* order attributes */
/*************************************************************************************************/

struct SmMlAttributePos
{
    SmMlAttributeValueType m_aAttributeValueType;
    uint_fast8_t m_nPos;
};

/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
