/*
 * Copyright (C) 2015, The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include <stdarg.h>
#include <stdio.h>
#include <memory>
#include <optional>
#include <string>
#include <variant>
#include <vector>

enum {
  PACKAGE_PRIVATE = 0x00000000,
  PUBLIC = 0x00000001,
  PRIVATE = 0x00000002,
  PROTECTED = 0x00000003,
  SCOPE_MASK = 0x00000003,

  STATIC = 0x00000010,
  FINAL = 0x00000020,
  ABSTRACT = 0x00000040,

  OVERRIDE = 0x00000100,

  ALL_MODIFIERS = 0xffffffff
};

namespace android {
namespace aidl {
class CodeWriter;
}  // namespace aidl
}  // namespace android

namespace android {
namespace aidl {
namespace java {

// Write the modifiers that are set in both mod and mask
void WriteModifiers(CodeWriter* to, int mod, int mask);

struct AstNode {
  AstNode() = default;
  virtual ~AstNode() = default;
  virtual void Write(CodeWriter* to) const = 0;
  std::string ToString();
};

struct ClassElement : public AstNode {
  ClassElement() = default;
  virtual ~ClassElement() = default;
};

struct Expression : public AstNode {
  virtual ~Expression() = default;
};

struct LiteralExpression : public Expression {
  std::string value;

  explicit LiteralExpression(const std::string& value);
  virtual ~LiteralExpression() = default;
  void Write(CodeWriter* to) const override;
};

struct StringLiteralExpression : public Expression {
  std::string value;

  explicit StringLiteralExpression(const std::string& value);
  virtual ~StringLiteralExpression() = default;
  void Write(CodeWriter* to) const override;
};

struct Variable : public Expression {
  std::vector<std::string> annotations;
  const std::string type;
  std::string name;

  Variable() = default;
  Variable(const std::string& type, const std::string& name);
  virtual ~Variable() = default;

  void WriteDeclaration(CodeWriter* to) const;
  void Write(CodeWriter* to) const;
};

struct FieldVariable : public Expression {
  std::variant<std::shared_ptr<Expression>, std::string> receiver;
  std::string name;

  FieldVariable(std::shared_ptr<Expression> object, const std::string& name);
  FieldVariable(const std::string& clazz, const std::string& name);
  virtual ~FieldVariable() = default;

  void Write(CodeWriter* to) const;
};

struct Field : public ClassElement {
  std::string comment;
  std::vector<std::string> annotations;
  int modifiers = 0;
  std::shared_ptr<Variable> variable = nullptr;
  std::string value;

  Field() = default;
  Field(int modifiers, std::shared_ptr<Variable> variable);
  virtual ~Field() = default;

  void Write(CodeWriter* to) const override;
};

struct Statement : public AstNode {
  virtual ~Statement() = default;
};

struct LiteralStatement : public Statement {
 public:
  LiteralStatement(const std::string& value);
  virtual ~LiteralStatement() = default;
  void Write(CodeWriter* to) const override;

 private:
  const std::string value_;
};

struct StatementBlock : public Statement {
  std::vector<std::shared_ptr<Statement>> statements;

  StatementBlock() = default;
  virtual ~StatementBlock() = default;
  void Write(CodeWriter* to) const override;

  void Add(std::shared_ptr<Statement> statement);
  void Add(std::shared_ptr<Expression> expression);
};

struct ExpressionStatement : public Statement {
  std::shared_ptr<Expression> expression;

  explicit ExpressionStatement(std::shared_ptr<Expression> expression);
  virtual ~ExpressionStatement() = default;
  void Write(CodeWriter* to) const override;
};

struct Assignment : public Expression {
  std::shared_ptr<Variable> lvalue;
  std::shared_ptr<Expression> rvalue;
  std::optional<std::string> cast = std::nullopt;

  Assignment(std::shared_ptr<Variable> lvalue, std::shared_ptr<Expression> rvalue);
  Assignment(std::shared_ptr<Variable> lvalue, std::shared_ptr<Expression> rvalue,
             std::string cast);
  virtual ~Assignment() = default;
  void Write(CodeWriter* to) const override;
};

struct MethodCall : public Expression {
  std::variant<std::monostate, std::shared_ptr<Expression>, std::string> receiver;
  std::string name;
  std::vector<std::shared_ptr<Expression>> arguments;
  std::vector<std::string> exceptions;

  explicit MethodCall(const std::string& name);
  MethodCall(const std::string& name, const std::vector<std::shared_ptr<Expression>>& args);
  MethodCall(std::shared_ptr<Expression> obj, const std::string& name);
  MethodCall(const std::string& clazz, const std::string& name);
  MethodCall(std::shared_ptr<Expression> obj, const std::string& name,
             const std::vector<std::shared_ptr<Expression>>& args);
  MethodCall(const std::string&, const std::string& name,
             const std::vector<std::shared_ptr<Expression>>& args);
  virtual ~MethodCall() = default;
  void Write(CodeWriter* to) const override;
};

struct Comparison : public Expression {
  std::shared_ptr<Expression> lvalue;
  std::string op;
  std::shared_ptr<Expression> rvalue;

  Comparison(std::shared_ptr<Expression> lvalue, const std::string& op,
             std::shared_ptr<Expression> rvalue);
  virtual ~Comparison() = default;
  void Write(CodeWriter* to) const override;
};

struct NewExpression : public Expression {
  const std::string instantiableName;
  std::vector<std::shared_ptr<Expression>> arguments;

  explicit NewExpression(const std::string& name);
  NewExpression(const std::string& name, const std::vector<std::shared_ptr<Expression>>& args);
  virtual ~NewExpression() = default;
  void Write(CodeWriter* to) const override;
};

struct NewArrayExpression : public Expression {
  const std::string type;
  std::shared_ptr<Expression> size;

  NewArrayExpression(const std::string& type, std::shared_ptr<Expression> size);
  virtual ~NewArrayExpression() = default;
  void Write(CodeWriter* to) const override;
};

struct Cast : public Expression {
  const std::string type;
  std::shared_ptr<Expression> expression = nullptr;

  Cast() = default;
  Cast(const std::string& type, std::shared_ptr<Expression> expression);
  virtual ~Cast() = default;
  void Write(CodeWriter* to) const override;
};

struct VariableDeclaration : public Statement {
  std::shared_ptr<Variable> lvalue = nullptr;
  std::shared_ptr<Expression> rvalue = nullptr;

  explicit VariableDeclaration(std::shared_ptr<Variable> lvalue);
  VariableDeclaration(std::shared_ptr<Variable> lvalue, std::shared_ptr<Expression> rvalue);
  virtual ~VariableDeclaration() = default;
  void Write(CodeWriter* to) const override;
};

struct IfStatement : public Statement {
  std::shared_ptr<Expression> expression = nullptr;
  std::shared_ptr<StatementBlock> statements = std::make_shared<StatementBlock>();
  std::shared_ptr<IfStatement> elseif = nullptr;

  IfStatement() = default;
  virtual ~IfStatement() = default;
  void Write(CodeWriter* to) const override;
};

struct ReturnStatement : public Statement {
  std::shared_ptr<Expression> expression;

  explicit ReturnStatement(std::shared_ptr<Expression> expression);
  virtual ~ReturnStatement() = default;
  void Write(CodeWriter* to) const override;
};

struct TryStatement : public Statement {
  std::shared_ptr<StatementBlock> statements = std::make_shared<StatementBlock>();

  TryStatement() = default;
  virtual ~TryStatement() = default;
  void Write(CodeWriter* to) const override;
};

struct FinallyStatement : public Statement {
  std::shared_ptr<StatementBlock> statements = std::make_shared<StatementBlock>();

  FinallyStatement() = default;
  virtual ~FinallyStatement() = default;
  void Write(CodeWriter* to) const override;
};

struct Case : public AstNode {
  std::vector<std::string> cases;
  std::shared_ptr<StatementBlock> statements = std::make_shared<StatementBlock>();

  Case() = default;
  explicit Case(const std::string& c);
  virtual ~Case() = default;
  void Write(CodeWriter* to) const override;
};

struct SwitchStatement : public Statement {
  std::shared_ptr<Expression> expression;
  std::vector<std::shared_ptr<Case>> cases;

  explicit SwitchStatement(std::shared_ptr<Expression> expression);
  virtual ~SwitchStatement() = default;
  void Write(CodeWriter* to) const override;
};

struct Method : public ClassElement {
  std::string comment;
  std::vector<std::string> annotations;
  int modifiers = 0;
  std::optional<std::string> returnType = std::nullopt;  // nullopt means constructor
  std::string name;
  std::vector<std::shared_ptr<Variable>> parameters;
  std::vector<std::string> exceptions;
  std::shared_ptr<StatementBlock> statements = nullptr;

  Method() = default;
  virtual ~Method() = default;

  void Write(CodeWriter* to) const override;
};

struct LiteralClassElement : public ClassElement {
  std::string element;

  LiteralClassElement(std::string e) : element(e) {}
  virtual ~LiteralClassElement() = default;

  void Write(CodeWriter* to) const override;
};

struct Class : public ClassElement {
  enum { CLASS, INTERFACE };

  std::string comment;
  std::vector<std::string> annotations;
  int modifiers = 0;
  int what = CLASS;  // CLASS or INTERFACE
  std::string type;
  std::optional<std::string> extends = std::nullopt;
  std::vector<std::string> interfaces;
  std::vector<std::shared_ptr<ClassElement>> elements;

  Class() = default;
  virtual ~Class() = default;

  void Write(CodeWriter* to) const override;
};

class Document : public AstNode {
 public:
  Document(const std::string& comment,
           const std::string& package,
           std::unique_ptr<Class> clazz);
  virtual ~Document() = default;
  void Write(CodeWriter* to) const override;

 private:
  std::string comment_;
  std::string package_;
  std::unique_ptr<Class> clazz_;
};

extern std::shared_ptr<Expression> NULL_VALUE;
extern std::shared_ptr<Expression> THIS_VALUE;
extern std::shared_ptr<Expression> SUPER_VALUE;
extern std::shared_ptr<Expression> TRUE_VALUE;
extern std::shared_ptr<Expression> FALSE_VALUE;
}  // namespace java
}  // namespace aidl
}  // namespace android
