// Copyright (c) 2014-2018 Zano Project
// Copyright (c) 2014-2018 The Louisdor Project
// Copyright (c) 2012-2013 The Boolberry developers
// Copyright (c) 2017-2025 Lethean (https://lt.hn)
//
// Licensed under the European Union Public Licence (EUPL) version 1.2.
// You may obtain a copy of the licence at:
//
//     https://joinup.ec.europa.eu/software/page/eupl/licence-eupl
//
// The EUPL is a copyleft licence that is compatible with the MIT/X11
// licence used by the original projects; the MIT terms are therefore
// considered “grandfathered” under the EUPL for this code.
//
// SPDX‑License‑Identifier: EUPL-1.2
//

#pragma once 
#include "net/http_client.h"
#include "currency_protocol/blobdatatype.h"
#include "rpc/mining_protocol_defs.h"
#include "currency_core/difficulty.h"
#include <boost/atomic.hpp>
#include <atomic>


#define LOCAL_SCRATCHPAD_CACHE_EXPIRATION_INTERVAL 60*60*24*3   //3 days
#define LOCAL_SCRATCHPAD_CACHE_STORE_INTERVAL      60*60*12     //12 hours

/*
namespace mining
{
  class  simpleminer
  {
  public:
    static void init_options(boost::program_options::options_description& desc);
    bool init(const boost::program_options::variables_map& vm);
    bool run();
  private: 

    struct height_info_native
    {
      uint64_t height;
      crypto::hash id;
    };
    
    struct job_details_native
    {
      currency::blobdata blob;
      currency::difficulty_type difficulty;
      std::string job_id;
      height_info_native prev_hi;
    };


    static bool text_height_info_to_native_height_info(const height_info& job, height_info_native& hi_native);
    static bool native_height_info_to_text_height_info(height_info& job, const height_info_native& hi_native);

    template<class job_details_t>
    bool text_job_details_to_native_job_details(const job_details_t& job, simpleminer::job_details_native& native_details)
    {
      bool r = epee::string_tools::parse_hexstr_to_binbuff(job.blob, native_details.blob);
      CHECK_AND_ASSERT_MES(r, false, "wrong buffer sent from pool server");
      r = epee::string_tools::get_xtype_from_string(native_details.difficulty, job.difficulty);
      CHECK_AND_ASSERT_MES(r, false, "wrong buffer sent from pool server");
      native_details.job_id = job.job_id;

      return text_height_info_to_native_height_info(job.prev_hi, native_details.prev_hi);
    }



    bool get_job();
    bool reinit_scratchpad();
    bool apply_addendums(const std::list<addendum>& addms);
    bool pop_addendum(const addendum& add);
    bool push_addendum(const addendum& add);
    void worker_thread(uint64_t start_nonce, uint32_t nonce_offset, std::atomic<uint32_t> *result, std::atomic<bool> *do_reset, std::atomic<bool> *done);
    void update_fast_scratchpad();
    void free_fast_scratchpad();
    bool init_scratchpad();
    bool reset_scratchpad();
    bool load_scratchpad_from_file(const std::string& path);
    bool store_scratchpad_to_file(const std::string& path);

    std::vector<mining::addendum> m_blocks_addendums; //need to handle splits without re-downloading whole scratchpad
    height_info_native m_hi;
    std::vector<crypto::hash> m_scratchpad;
    crypto::hash *m_fast_scratchpad;
    uint32_t m_fast_scratchpad_pages;
    uint64_t m_last_job_ticks;
    uint64_t m_last_scratchpad_store_time;
    bool m_fast_mmapped;
    uint32_t m_threads_total;
    std::atomic<uint64_t> m_hashes_done;
    std::string m_pool_session_id;
    simpleminer::job_details_native m_job;
    std::condition_variable m_work_done_cond;
    std::mutex m_work_mutex;
    std::string m_scratchpad_url;
    std::string m_scratchpad_local_path;

    std::string m_pool_ip;
    std::string m_pool_port;
    std::string m_login;
    std::string m_pass;
    epee::net_utils::http::http_simple_client m_http_client;
  };
}
*/