/*
 * Copyright (C) 2021-present ScyllaDB
 *
 */

/*
 * SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.0
 */

#pragma once

#include <seastar/core/condition-variable.hh>

#include "schema/schema_fwd.hh"
#include "sstables/open_info.hh"
#include "compaction_descriptor.hh"

class reader_permit;

namespace sstables {
class sstable_set;
class sstables_manager;
struct sstable_writer_config;
}

namespace compaction {
class compaction_strategy;
class compaction_strategy_state;
class compaction_backlog_tracker;

class compaction_group_view {
public:
    virtual ~compaction_group_view() {}
    virtual dht::token_range token_range() const noexcept = 0;
    virtual const schema_ptr& schema() const noexcept = 0;
    // min threshold as defined by table.
    virtual unsigned min_compaction_threshold() const noexcept = 0;
    virtual bool compaction_enforce_min_threshold() const noexcept = 0;
    virtual future<lw_shared_ptr<const sstables::sstable_set>> main_sstable_set() const = 0;
    virtual future<lw_shared_ptr<const sstables::sstable_set>> maintenance_sstable_set() const = 0;
    virtual lw_shared_ptr<const sstables::sstable_set> sstable_set_for_tombstone_gc() const = 0;
    virtual std::unordered_set<sstables::shared_sstable> fully_expired_sstables(const std::vector<sstables::shared_sstable>& sstables, gc_clock::time_point compaction_time) const = 0;
    virtual const std::vector<sstables::shared_sstable>& compacted_undeleted_sstables() const noexcept = 0;
    virtual compaction_strategy& get_compaction_strategy() const noexcept = 0;
    virtual compaction_strategy_state& get_compaction_strategy_state() noexcept = 0;
    virtual reader_permit make_compaction_reader_permit() const = 0;
    virtual sstables::sstables_manager& get_sstables_manager() noexcept = 0;
    virtual sstables::shared_sstable make_sstable(sstables::sstable_state) const = 0;
    virtual sstables::shared_sstable make_sstable(sstables::sstable_state, sstables::sstable_version_types) const = 0;
    virtual sstables::sstable_writer_config configure_writer(sstring origin) const = 0;
    virtual api::timestamp_type min_memtable_timestamp() const = 0;
    virtual api::timestamp_type min_memtable_live_timestamp() const = 0;
    virtual api::timestamp_type min_memtable_live_row_marker_timestamp() const = 0;
    virtual bool memtable_has_key(const dht::decorated_key& key) const = 0;
    virtual future<> on_compaction_completion(compaction_completion_desc desc, sstables::offstrategy offstrategy) = 0;
    virtual bool is_auto_compaction_disabled_by_user() const noexcept = 0;
    virtual bool tombstone_gc_enabled() const noexcept = 0;
    virtual tombstone_gc_state get_tombstone_gc_state() const noexcept = 0;
    virtual compaction_backlog_tracker& get_backlog_tracker() = 0;
    virtual const std::string get_group_id() const noexcept = 0;
    virtual seastar::condition_variable& get_staging_done_condition() noexcept = 0;
    virtual dht::token_range get_token_range_after_split(const dht::token& t) const noexcept = 0;
    virtual int64_t get_sstables_repaired_at() const noexcept = 0;
};

} // namespace compaction

namespace fmt {

template <>
struct formatter<compaction::compaction_group_view> : formatter<string_view> {
    template <typename FormatContext>
    auto format(const compaction::compaction_group_view& t, FormatContext& ctx) const {
        auto s = t.schema();
        return fmt::format_to(ctx.out(), "{}.{} compaction_group={}", s->ks_name(), s->cf_name(), t.get_group_id());
    }
};

} // namespace fmt
