/*
    This file is part of TON Blockchain Library.
    TON Blockchain Library is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation, either version 2 of the License, or
    (at your option) any later version.
    TON Blockchain Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.
    You should have received a copy of the GNU Lesser General Public License
    along with TON Blockchain Library.  If not, see .
    Copyright 2017-2020 Telegram Systems LLP
*/
#pragma once
#include "catchain.h"
namespace ton {
namespace catchain {
class CatChainBlockImpl : public CatChainBlock {
 private:
  std::unique_ptr extra_;
  td::uint32 src_;
  td::uint32 fork_;
  PublicKeyHash src_hash_;
  CatChainBlockHeight height_;
  CatChainBlockHash hash_;
  td::SharedSlice payload_;
  CatChainBlock *prev_;
  std::vector deps_;
  std::vector vt_;
  bool preprocess_sent_ = false;
  bool is_processed_ = false;
 public:
  td::SharedSlice &payload() override {
    return payload_;
  }
  const td::SharedSlice &payload() const override {
    return payload_;
  }
  CatChainBlock::Extra *extra() const override {
    return extra_.get();
  }
  std::unique_ptr move_extra() override {
    return std::move(extra_);
  }
  void set_extra(std::unique_ptr extra) override {
    extra_ = std::move(extra);
  }
  td::uint32 source() const override {
    return src_;
  }
  td::uint32 fork() const override {
    return fork_;
  }
  PublicKeyHash source_hash() const override {
    return src_hash_;
  }
  CatChainBlockHash hash() const override {
    return hash_;
  }
  CatChainBlockHeight height() const override {
    return height_;
  }
  CatChainBlock *prev() override {
    return prev_;
  }
  const CatChainBlock *prev() const override {
    return prev_;
  }
  const std::vector &deps() const override {
    return deps_;
  }
  const std::vector &vt() const override {
    return vt_;
  }
  bool preprocess_is_sent() const override {
    return preprocess_sent_;
  }
  void preprocess_sent() override {
    preprocess_sent_ = true;
  }
  bool is_processed() const override {
    return is_processed_;
  }
  void set_processed() override {
    is_processed_ = true;
  }
  bool is_descendant_of(CatChainBlock *block) override;
  CatChainBlockImpl(td::uint32 src, td::uint32 fork, PublicKeyHash src_hash, CatChainBlockHeight height,
                    CatChainBlockHash hash, td::SharedSlice payload, CatChainBlock *prev,
                    std::vector deps, std::vector vt);
};
}  // namespace catchain
}  // namespace ton