#pragma once

#include <QString>

#include "Token.h"
#include "AstNode.h"
#include "Function.h"

struct ParsePos
{
	int line = 0,
		pos = 0,
		lineOffset = 0;
};

class ParseResult
{
public:
	ParseResult() = default;
	ParseResult(bool okay);
	explicit ParseResult(int status, ParsePos pos = {});
	ParseResult(int status, QString message, ParsePos pos = {});
	
	enum
	{
		NO_MATCH,
		COMPLETE,
		INCOMPLETE,
	};

	operator bool() const;

	ParsePos pos() const;
	QString message() const;
	int status() const;

    ParseResult operator ||(const ParseResult &other) const;

private:
	int _status = COMPLETE;
	QString _message = "";
	ParsePos _pos;
};

class Parser
{
public:
    explicit Parser(QString input);

    QChar peek();
    QChar get();
    bool atEnd();

    void skip();

    template <typename T>
    ParseResult parseSymbol(T *node);

    template <typename T>
    ParseResult parseIdentifier(T *node);

    template <typename T>
    ParseResult parseNumber(T *node);

    template <typename T>
    ParseResult parseVariable(T *node);

    template <typename T>
    ParseResult parseParens(T *node);

    ParseResult parseFunction(AstNode *node);

    template <typename T>
    ParseResult parseMany(QList<T> *list);

    template <typename T>
    ParseResult parseOne(T *node);

    ParseResult parseSentence(Sentence *sentence);
    ParseResult parseFunctionDefinition(Function *function);

	ParsePos save() const;
	void reset(ParsePos pos);

private:
    int _pos = 0;
	int _line = 1;
	int _offset = 1;

    QString _input;
};

template <>
ParseResult Parser::parseOne<Token>(Token *node);

template <>
ParseResult Parser::parseOne<AstNode>(AstNode *node);
