#pragma once

///
/// @file yt/cpp/mapreduce/interface/fwd.h
///
/// Header containing mostly forward declarations of types.


#include <util/generic/fwd.h>
#include <util/system/types.h>

#include <variant>

/// @cond Doxygen_Suppress
namespace google::protobuf {
    class Message;
}

namespace NYT {

    ////////////////////////////////////////////////////////////////////////////////
    // batch_request.h
    ////////////////////////////////////////////////////////////////////////////////

    class IBatchRequest;
    using TBatchRequestPtr = ::TIntrusivePtr<IBatchRequest>;

    ////////////////////////////////////////////////////////////////////////////////
    // client.h
    ////////////////////////////////////////////////////////////////////////////////

    enum ELockMode : int;

    struct TStartTransactionOptions;

    struct TLockOptions;

    template <class TDerived>
    struct TTabletOptions;

    struct TMountTableOptions;

    struct TUnmountTableOptions;

    struct TRemountTableOptions;

    struct TReshardTableOptions;

    struct TAlterTableOptions;

    struct TLookupRowsOptions;

    struct TSelectRowsOptions;

    struct TCreateClientOptions;

    struct TAlterTableReplicaOptions;

    struct TGetFileFromCacheOptions;

    struct TPutFileToCacheOptions;

    struct TCheckPermissionResult;
    struct TCheckPermissionResponse;
    struct TCheckPermissionOptions;

    struct TTabletInfo;

    class ILock;
    using ILockPtr = ::TIntrusivePtr<ILock>;

    class ITransaction;
    using ITransactionPtr = ::TIntrusivePtr<ITransaction>;

    class ITransactionPinger;
    using ITransactionPingerPtr = ::TIntrusivePtr<ITransactionPinger>;

    struct IOperation;
    using IOperationPtr = ::TIntrusivePtr<IOperation>;

    class IClientBase;

    class IClient;

    using IClientPtr = ::TIntrusivePtr<IClient>;
    using IClientBasePtr = ::TIntrusivePtr<IClientBase>;

    ////////////////////////////////////////////////////////////////////////////////
    // config.h
    ////////////////////////////////////////////////////////////////////////////////

    struct TConfig;
    using TConfigPtr = ::TIntrusivePtr<TConfig>;

    ////////////////////////////////////////////////////////////////////////////////
    // cypress.h
    ////////////////////////////////////////////////////////////////////////////////

    enum ENodeType : int;

    struct TCreateOptions;

    struct TRemoveOptions;

    struct TGetOptions;

    struct TSetOptions;

    struct TMultisetAttributesOptions;

    struct TListOptions;

    struct TCopyOptions;

    struct TMoveOptions;

    struct TLinkOptions;

    struct TConcatenateOptions;

    struct TInsertRowsOptions;

    struct TDeleteRowsOptions;

    struct TTrimRowsOptions;

    class ICypressClient;

    ////////////////////////////////////////////////////////////////////////////////
    // errors.h
    ////////////////////////////////////////////////////////////////////////////////

    class TApiUsageError;

    class TYtError;

    class TErrorResponse;

    struct TFailedJobInfo;

    class TOperationFailedError;

    ////////////////////////////////////////////////////////////////////////////////
    // node.h
    ////////////////////////////////////////////////////////////////////////////////

    class TNode;

    ////////////////////////////////////////////////////////////////////////////////
    // common.h
    ////////////////////////////////////////////////////////////////////////////////

    using TTransactionId = TGUID;
    using TNodeId = TGUID;
    using TLockId = TGUID;
    using TOperationId = TGUID;
    using TTabletCellId = TGUID;
    using TReplicaId = TGUID;
    using TJobId = TGUID;

    using TYPath = TString;
    using TLocalFilePath = TString;

    template <class T, class TDerived = void>
    struct TOneOrMany;

    // key column values
    using TKey = TOneOrMany<TNode>;

    class TSortColumn;

    // column names
    using TColumnNames = TOneOrMany<TString>;

    // key column descriptors.
    class TSortColumns;

    enum EValueType : int;

    enum ESortOrder : int;

    enum EOptimizeForAttr : i8;

    enum EErasureCodecAttr : i8;

    enum ESchemaModificationAttr : i8;

    enum class EMasterReadKind : int;

    class TColumnSchema;

    class TTableSchema;

    enum class ERelation;

    struct TKeyBound;

    struct TReadLimit;

    struct TReadRange;

    struct TRichYPath;

    struct TAttributeFilter;

    ////////////////////////////////////////////////////////////////////////////////
    // io.h
    ////////////////////////////////////////////////////////////////////////////////

    enum class EFormatType : int;

    struct TFormat;

    class IFileReader;

    using IFileReaderPtr = ::TIntrusivePtr<IFileReader>;

    class IFileWriter;

    using IFileWriterPtr = ::TIntrusivePtr<IFileWriter>;

    class IBlobTableReader;
    using IBlobTableReaderPtr = ::TIntrusivePtr<IBlobTableReader>;

    class TRawTableReader;

    using TRawTableReaderPtr = ::TIntrusivePtr<TRawTableReader>;

    class TRawTableWriter;

    using TRawTableWriterPtr = ::TIntrusivePtr<TRawTableWriter>;

    template <class T, class = void>
    class TTableReader;

    template <class T, class = void>
    class TTableRangesReader;

    template <typename T>
    using TTableRangesReaderPtr = ::TIntrusivePtr<TTableRangesReader<T>>;

    template <class T>
    using TTableReaderPtr = ::TIntrusivePtr<TTableReader<T>>;

    template <class T, class = void>
    class TTableWriter;

    template <class T>
    using TTableWriterPtr = ::TIntrusivePtr<TTableWriter<T>>;

    struct TYaMRRow;

    using ::google::protobuf::Message;

    class ISkiffRowParser;

    using ISkiffRowParserPtr = ::TIntrusivePtr<ISkiffRowParser>;

    class ISkiffRowSkipper;

    using ISkiffRowSkipperPtr = ::TIntrusivePtr<ISkiffRowSkipper>;

    namespace NDetail {

    class TYdlGenericRowType;

    } // namespace NDetail

    template<class... TYdlRowTypes>
    class TYdlOneOf;

    template<class... TProtoRowTypes>
    class TProtoOneOf;

    template<class... TSkiffRowTypes>
    class TSkiffRowOneOf;

    using TYaMRReader = TTableReader<TYaMRRow>;
    using TYaMRWriter = TTableWriter<TYaMRRow>;
    using TNodeReader = TTableReader<TNode>;
    using TNodeWriter = TTableWriter<TNode>;
    using TMessageReader = TTableReader<Message>;
    using TMessageWriter = TTableWriter<Message>;
    using TYdlTableWriter = TTableWriter<NDetail::TYdlGenericRowType>;

    template <class TDerived>
    struct TIOOptions;

    struct TFileReaderOptions;

    struct TFileWriterOptions;

    struct TTableReaderOptions;

    class TSkiffRowHints;

    struct TTableWriterOptions;

    ////////////////////////////////////////////////////////////////////////////////
    // job_statistics.h
    ////////////////////////////////////////////////////////////////////////////////

    class TJobStatistics;

    template <typename T>
    class TJobStatisticsEntry;

    ////////////////////////////////////////////////////////////////////////////////
    // operation.h
    ////////////////////////////////////////////////////////////////////////////////

    class TFormatHints;

    struct TUserJobSpec;

    struct TMapOperationSpec;

    struct TRawMapOperationSpec;

    struct TReduceOperationSpec;

    struct TMapReduceOperationSpec;

    struct TJoinReduceOperationSpec;

    struct TSortOperationSpec;

    class IIOperationPreparationContext;

    class IJob;
    using IJobPtr = ::TIntrusivePtr<IJob>;

    class IRawJob;
    using IRawJobPtr = ::TIntrusivePtr<IRawJob>;

    enum EMergeMode : int;

    struct TMergeOperationSpec;

    struct TEraseOperationSpec;

    template <class TR, class TW>
    class IMapper;

    template <class TR, class TW>
    class IReducer;

    template <class TR, class TW>
    class IAggregatorReducer;

    struct TSuspendOperationOptions;

    struct TResumeOperationOptions;

    enum class EOperationBriefState : int;

    struct TOperationAttributes;

    struct TOperationOptions;

    enum class EOperationAttribute : int;

    struct TOperationAttributeFilter;

    struct TGetOperationOptions;

    struct TListOperationsOptions;

    struct TGetJobOptions;

    struct TListJobsOptions;

    struct IOperationClient;

    enum class EFinishedJobState : int;

    enum class EJobType : int;
    enum class EJobState : int;
    enum class ETaskName : int;
    class TTaskName;

    struct TJobBinaryDefault;

    struct TJobBinaryLocalPath;

    struct TJobBinaryCypressPath;

    using TJobBinaryConfig = std::variant<
        TJobBinaryDefault,
        TJobBinaryLocalPath,
        TJobBinaryCypressPath>;

    struct TRetryConfig;
    class IRetryConfigProvider;
    using IRetryConfigProviderPtr = ::TIntrusivePtr<IRetryConfigProvider>;
}
/// @endcond