/*
    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 .
*/
#pragma once
#include "ton/ton-types.h"
#include "auto/tl/lite_api.h"
#include "td/utils/port/IPAddress.h"
#include "adnl/adnl-node-id.hpp"
namespace liteclient {
struct QueryInfo {
  enum Type { t_simple, t_seqno, t_utime, t_lt, t_mc_seqno };
  int query_id = 0;
  ton::ShardIdFull shard_id{ton::masterchainId};
  Type type = t_simple;
  td::uint64 value = 0;
  /* Query types and examples:
   * t_simple - query to the recent blocks in a shard, or general info. value = 0.
   *   getTime, getMasterchainInfo (shard_id = masterchain)
   *   sendMessage
   *   getAccountState, runSmcMethod - when no block is given
   * t_seqno - query to block with seqno in a shard. value = seqno.
   *   lookupBlock by seqno
   *   getBlock, getBlockHeader
   *   getAccountState, runSmcMethod  - when shard block is given
   * t_utime - query to a block with given unixtime in a shard. value = utime.
   *   lookupBlock by utime
   * t_lt - query to a block with given lt in a shard. value = lt.
   *   lookupBlock by lt
   *   getTransactions
   * t_mc_seqno - query to a block in a shard, masterchain seqno is given. value = mc_seqno.
   *   getAccountState, runSmcMethod - when mc block is given
   */
  std::string to_str() const;
};
QueryInfo get_query_info(td::Slice data);
QueryInfo get_query_info(const ton::lite_api::Function& f);
struct LiteServerConfig {
 private:
  struct ShardInfo {
    ton::ShardIdFull shard_id;
    ton::BlockSeqno seqno;
    ton::UnixTime utime;
    ton::LogicalTime lt;
  };
  struct Slice {
    std::vector shards_from, shards_to;
    bool unlimited = false;
    bool accepts_query(const QueryInfo& query_info) const;
  };
  bool is_full = false;
  std::vector slices;
 public:
  ton::adnl::AdnlNodeIdFull adnl_id;
  td::IPAddress addr;
  LiteServerConfig() = default;
  LiteServerConfig(ton::adnl::AdnlNodeIdFull adnl_id, td::IPAddress addr)
      : is_full(true), adnl_id(adnl_id), addr(addr) {
  }
  bool accepts_query(const QueryInfo& query_info) const;
  static td::Result> parse_global_config(
      const ton::ton_api::liteclient_config_global& config);
};
}  // namespace liteclient