/****************************************************************************
**
** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the tools applications of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#ifndef ATOM_H
#define ATOM_H

#include "node.h"

#include <QtCore/qdebug.h>
#include <QtCore/qstringlist.h>

QT_BEGIN_NAMESPACE

class Tree;
class LinkAtom;

class Atom
{
public:
    enum AtomType {
        AnnotatedList,
        AutoLink,
        BaseName,
        BR,
        BriefLeft,
        BriefRight,
        C,
        CaptionLeft,
        CaptionRight,
        Code,
        CodeBad,
        CodeNew,
        CodeOld,
        CodeQuoteArgument,
        CodeQuoteCommand,
        DivLeft,
        DivRight,
        EndQmlText,
        ExampleFileLink,
        ExampleImageLink,
        FootnoteLeft,
        FootnoteRight,
        FormatElse,
        FormatEndif,
        FormatIf,
        FormattingLeft,
        FormattingRight,
        GeneratedList,
        HR,
        Image,
        ImageText,
        ImportantLeft,
        ImportantRight,
        InlineImage,
        JavaScript,
        EndJavaScript,
        Keyword,
        LegaleseLeft,
        LegaleseRight,
        LineBreak,
        Link,
        LinkNode,
        ListLeft,
        ListItemNumber,
        ListTagLeft,
        ListTagRight,
        ListItemLeft,
        ListItemRight,
        ListRight,
        NavAutoLink,
        NavLink,
        Nop,
        NoteLeft,
        NoteRight,
        ParaLeft,
        ParaRight,
        Qml,
        QmlText,
        QuotationLeft,
        QuotationRight,
        RawString,
        SectionLeft,
        SectionRight,
        SectionHeadingLeft,
        SectionHeadingRight,
        SidebarLeft,
        SidebarRight,
        SinceList,
        SinceTagLeft,
        SinceTagRight,
        SnippetCommand,
        SnippetIdentifier,
        SnippetLocation,
        String,
        TableLeft,
        TableRight,
        TableHeaderLeft,
        TableHeaderRight,
        TableRowLeft,
        TableRowRight,
        TableItemLeft,
        TableItemRight,
        TableOfContents,
        Target,
        UnhandledFormat,
        UnknownCommand,
        Last = UnknownCommand
    };

    friend class LinkAtom;

    Atom(AtomType type, const QString &string = "") : type_(type), strs(string) {}

    Atom(AtomType type, const QString &p1, const QString &p2) : type_(type), strs(p1)
    {
        if (!p2.isEmpty())
            strs << p2;
    }

    Atom(Atom *previous, AtomType type, const QString &string)
        : next_(previous->next_), type_(type), strs(string)
    {
        previous->next_ = this;
    }

    Atom(Atom *previous, AtomType type, const QString &p1, const QString &p2)
        : next_(previous->next_), type_(type), strs(p1)
    {
        if (!p2.isEmpty())
            strs << p2;
        previous->next_ = this;
    }

    virtual ~Atom() = default;

    void appendChar(QChar ch) { strs[0] += ch; }
    void appendString(const QString &string) { strs[0] += string; }
    void chopString() { strs[0].chop(1); }
    void setString(const QString &string) { strs[0] = string; }
    Atom *next() { return next_; }
    void setNext(Atom *newNext) { next_ = newNext; }

    const Atom *next() const { return next_; }
    const Atom *next(AtomType t) const;
    const Atom *next(AtomType t, const QString &s) const;
    AtomType type() const { return type_; }
    QString typeString() const;
    const QString &string() const { return strs[0]; }
    const QString &string(int i) const { return strs[i]; }
    int count() const { return strs.size(); }
    void dump() const;
    const QStringList &strings() const { return strs; }

    virtual bool isLinkAtom() const { return false; }
    virtual Node::Genus genus() { return Node::DontCare; }
    virtual bool specifiesDomain() { return false; }
    virtual Tree *domain() { return nullptr; }
    virtual Node::NodeType goal() { return Node::NoType; }
    virtual const QString &error() { return noError_; }
    virtual void resolveSquareBracketParams() {}

protected:
    static QString noError_;
    Atom *next_ = nullptr;
    AtomType type_;
    QStringList strs;
};

class LinkAtom : public Atom
{
public:
    LinkAtom(const QString &p1, const QString &p2);
    LinkAtom(const LinkAtom &t);
    LinkAtom(Atom *previous, const LinkAtom &t);
    ~LinkAtom() override {}

    bool isLinkAtom() const override { return true; }
    Node::Genus genus() override
    {
        resolveSquareBracketParams();
        return genus_;
    }
    bool specifiesDomain() override
    {
        resolveSquareBracketParams();
        return (domain_ != nullptr);
    }
    Tree *domain() override
    {
        resolveSquareBracketParams();
        return domain_;
    }
    Node::NodeType goal() override
    {
        resolveSquareBracketParams();
        return goal_;
    }
    const QString &error() override { return error_; }
    void resolveSquareBracketParams() override;

protected:
    bool resolved_;
    Node::Genus genus_;
    Node::NodeType goal_;
    Tree *domain_;
    QString error_;
    QString squareBracketParams_;
};

#define ATOM_FORMATTING_BOLD "bold"
#define ATOM_FORMATTING_INDEX "index"
#define ATOM_FORMATTING_ITALIC "italic"
#define ATOM_FORMATTING_LINK "link"
#define ATOM_FORMATTING_PARAMETER "parameter"
#define ATOM_FORMATTING_SPAN "span "
#define ATOM_FORMATTING_SUBSCRIPT "subscript"
#define ATOM_FORMATTING_SUPERSCRIPT "superscript"
#define ATOM_FORMATTING_TELETYPE "teletype"
#define ATOM_FORMATTING_UICONTROL "uicontrol"
#define ATOM_FORMATTING_UNDERLINE "underline"

#define ATOM_LIST_BULLET "bullet"
#define ATOM_LIST_TAG "tag"
#define ATOM_LIST_VALUE "value"
#define ATOM_LIST_LOWERALPHA "loweralpha"
#define ATOM_LIST_LOWERROMAN "lowerroman"
#define ATOM_LIST_NUMERIC "numeric"
#define ATOM_LIST_UPPERALPHA "upperalpha"
#define ATOM_LIST_UPPERROMAN "upperroman"

QT_END_NAMESPACE

#endif
