% Licensed under the Apache License, Version 2.0 (the "License"); you may not
% use this file except in compliance with the License. You may obtain a copy of
% the License at
%
%   http://www.apache.org/licenses/LICENSE-2.0
%
% Unless required by applicable law or agreed to in writing, software
% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
% License for the specific language governing permissions and limitations under
% the License.

-module(erlfdb_nif).

-compile(no_native).
-on_load(init/0).

-export([
    ohai/0,

    get_max_api_version/0,

    future_cancel/1,
    future_is_ready/1,
    future_get_error/1,
    future_get/1,

    create_database/1,
    database_set_option/2,
    database_set_option/3,
    database_create_transaction/1,

    transaction_set_option/2,
    transaction_set_option/3,
    transaction_set_read_version/2,
    transaction_get_read_version/1,
    transaction_get/3,
    transaction_get_key/3,
    transaction_get_addresses_for_key/2,
    transaction_get_range/9,
    transaction_set/3,
    transaction_clear/2,
    transaction_clear_range/3,
    transaction_atomic_op/4,
    transaction_commit/1,
    transaction_get_committed_version/1,
    transaction_get_versionstamp/1,
    transaction_watch/2,
    transaction_on_error/2,
    transaction_reset/1,
    transaction_cancel/1,
    transaction_add_conflict_range/4,
    transaction_get_next_tx_id/1,
    transaction_is_read_only/1,

    get_error/1,
    error_predicate/2
]).


-define(DEFAULT_API_VERSION, 610).


-type error() :: {erlfdb_error, Code::integer()}.
-type future() :: {erlfdb_future, reference(), reference()}.
-type database() :: {erlfdb_database, reference()}.
-type transaction() :: {erlfdb_transaction, reference()}.

-type option_value() :: integer() | binary().

-type key_selector() ::
    {Key::binary(), lt | lteq | gt | gteq} |
    {Key::binary(), OrEqual::boolean(), Offset::integer()}.

-type future_result() ::
    database() |
    integer() |
    binary() |
    {[{binary(), binary()}], integer(), boolean()} |
    not_found |
    {error, invalid_future_type}.

-type network_option() ::
    local_address |
    cluster_file |
    trace_enable |
    trace_format |
    trace_roll_size |
    trace_max_logs_size |
    trace_log_group |
    knob |
    tls_plugin |
    tls_cert_bytes |
    tls_cert_path |
    tls_key_bytes |
    tls_key_path |
    tls_verify_peers |
    buggify_enable |
    buggify_disable |
    buggify_section_activated_probability |
    buggify_section_fired_probability |
    tls_ca_bytes |
    tls_ca_path |
    tls_password |
    disable_multi_version_client_api |
    callbacks_on_external_threads |
    external_client_library |
    external_client_directory |
    disable_local_client |
    disable_client_statistics_logging |
    enable_slow_task_profiling.

-type database_option() ::
    location_cache_size |
    max_watches |
    machine_id |
    datacenter_id.

-type transaction_option() ::
    causal_write_risky |
    causal_read_risky |
    causal_read_disable |
    next_write_no_write_conflict_range |
    read_your_writes_disable |
    read_ahead_disable |
    durability_datacenter |
    durability_risky |
    durability_dev_null_is_web_scale |
    priority_system_immediate |
    priority_batch |
    initialize_new_database |
    access_system_keys |
    read_system_keys |
    debug_retry_logging |
    transaction_logging_enable |
    timeout |
    retry_limit |
    max_retry_delay |
    snapshot_ryw_enable |
    snapshot_ryw_disable |
    lock_aware |
    used_during_commit_protection_disable |
    read_lock_aware.

-type streaming_mode() ::
    stream_want_all |
    stream_iterator |
    stream_exact |
    stream_small |
    stream_medium |
    stream_large |
    stream_serial.

-type atomic_mode() ::
    add |
    bit_and |
    bit_or |
    bit_xor |
    append_if_fits |
    max |
    min |
    byte_min |
    byte_max |
    set_versionstamped_key |
    set_versionstamped_value.

-type atomic_operand() :: integer() | binary().

-type conflict_type() :: read | write.

-type error_predicate() ::
        retryable |
        maybe_committed |
        retryable_not_committed.


ohai() ->
    foo.


-spec get_max_api_version() -> {ok, integer()}.
get_max_api_version() ->
    erlfdb_get_max_api_version().


-spec future_cancel(future()) -> ok.
future_cancel({erlfdb_future, _Ref, Ft}) ->
    erlfdb_future_cancel(Ft).


-spec future_is_ready(future()) -> boolean().
future_is_ready({erlfdb_future, _Ref, Ft}) ->
    erlfdb_future_is_ready(Ft).


-spec future_get_error(future()) -> error().
future_get_error({erlfdb_future, _Ref, Ft}) ->
    erlfdb_future_get_error(Ft).


-spec future_get(future()) -> future_result().
future_get({erlfdb_future, _Ref, Ft}) ->
    erlfdb_future_get(Ft).


-spec create_database(ClusterFilePath::binary()) -> database().
create_database(<<>>) ->
    create_database(<<0>>);

create_database(ClusterFilePath) ->
    Size = size(ClusterFilePath) - 1,
    % Make sure we pass a NULL-terminated string
    % to FoundationDB
    NifPath = case ClusterFilePath of
        <<_:Size/binary, 0>> ->
            ClusterFilePath;
        _ ->
            <<ClusterFilePath/binary, 0>>
    end,
    erlfdb_create_database(NifPath).


-spec database_set_option(database(), Option::database_option()) -> ok.
database_set_option(Database, Option) ->
    database_set_option(Database, Option, <<>>).


-spec database_set_option(
        database(),
        Option::database_option(),
        Value::option_value()
    ) -> ok.
database_set_option({erlfdb_database, Db}, Opt, Val) ->
    erlfdb_database_set_option(Db, Opt, Val).


-spec database_create_transaction(database()) ->
        {ok, transaction()}.
database_create_transaction({erlfdb_database, Db}) ->
    erlfdb_database_create_transaction(Db).


-spec transaction_set_option(transaction(), Option::transaction_option()) -> ok.
transaction_set_option(Transaction, Option) ->
    transaction_set_option(Transaction, Option, <<>>).


-spec transaction_set_option(
        transaction(),
        Option::transaction_option(),
        Value::option_value()
    ) -> ok.
transaction_set_option({erlfdb_transaction, Tx}, Opt, Val) ->
    BinVal = case Val of
        B when is_binary(B) -> B;
        I when is_integer(I) -> <<I:8/little-unsigned-integer-unit:8>>
    end,
    erlfdb_transaction_set_option(Tx, Opt, BinVal).


-spec transaction_set_read_version(transaction(), Version::integer()) -> ok.
transaction_set_read_version({erlfdb_transaction, Tx}, Version) ->
    erlfdb_transaction_set_read_version(Tx, Version).


-spec transaction_get_read_version(transaction()) -> future().
transaction_get_read_version({erlfdb_transaction, Tx}) ->
    erlfdb_transaction_get_read_version(Tx).


-spec transaction_get(transaction(), Key::binary(), Snapshot::boolean()) ->
        future().
transaction_get({erlfdb_transaction, Tx}, Key, Snapshot) ->
    erlfdb_transaction_get(Tx, Key, Snapshot).


-spec transaction_get_key(
        transaction(),
        KeySelector::key_selector(),
        Snapshot::boolean()
    ) -> future().
transaction_get_key({erlfdb_transaction, Tx}, KeySelector, Snapshot) ->
    erlfdb_transaction_get_key(Tx, KeySelector, Snapshot).


-spec transaction_get_addresses_for_key(transaction(), Key::binary()) ->
        future().
transaction_get_addresses_for_key({erlfdb_transaction, Tx}, Key) ->
    erlfdb_transaction_get_addresses_for_key(Tx, Key).


-spec transaction_get_range(
        transaction(),
        StartKeySelector::key_selector(),
        EndKeySelector::key_selector(),
        Limit::non_neg_integer(),
        TargetBytes::non_neg_integer(),
        StreamingMode::streaming_mode(),
        Iteration::non_neg_integer(),
        Snapshot::boolean(),
        Reverse::boolean()
    ) -> future().
transaction_get_range(
        {erlfdb_transaction, Tx},
        StartKeySelector,
        EndKeySelector,
        Limit,
        TargetBytes,
        StreamingMode,
        Iteration,
        Snapshot,
        Reverse
    ) ->
    erlfdb_transaction_get_range(
            Tx,
            StartKeySelector,
            EndKeySelector,
            Limit,
            TargetBytes,
            StreamingMode,
            Iteration,
            Snapshot,
            Reverse
        ).


-spec transaction_set(transaction(), Key::binary(), Val::binary()) -> ok.
transaction_set({erlfdb_transaction, Tx}, Key, Val) ->
    erlfdb_transaction_set(Tx, Key, Val).


-spec transaction_clear(transaction(), Key::binary()) -> ok.
transaction_clear({erlfdb_transaction, Tx}, Key) ->
    erlfdb_transaction_clear(Tx, Key).


-spec transaction_clear_range(
        transaction(),
        StartKey::binary(),
        EndKey::binary()
    ) -> ok.
transaction_clear_range({erlfdb_transaction, Tx}, StartKey, EndKey) ->
    erlfdb_transaction_clear_range(Tx, StartKey, EndKey).


-spec transaction_atomic_op(
        transaction(),
        Key::binary(),
        Operand::atomic_operand(),
        Mode::atomic_mode()
    ) -> ok.
transaction_atomic_op({erlfdb_transaction, Tx}, Key, Operand, OpName) ->
    BinOperand = case Operand of
        Bin when is_binary(Bin) ->
            Bin;
        Int when is_integer(Int) ->
            <<Int:64/little>>
    end,
    erlfdb_transaction_atomic_op(Tx, Key, BinOperand, OpName).


-spec transaction_commit(transaction()) -> future().
transaction_commit({erlfdb_transaction, Tx}) ->
    erlfdb_transaction_commit(Tx).


-spec transaction_get_committed_version(transaction()) -> integer().
transaction_get_committed_version({erlfdb_transaction, Tx}) ->
    erlfdb_transaction_get_committed_version(Tx).


-spec transaction_get_versionstamp(transaction()) -> future().
transaction_get_versionstamp({erlfdb_transaction, Tx}) ->
    erlfdb_transaction_get_versionstamp(Tx).


-spec transaction_watch(transaction(), Key::binary()) -> future().
transaction_watch({erlfdb_transaction, Tx}, Key) ->
    erlfdb_transaction_watch(Tx, Key).


-spec transaction_on_error(transaction(), Error::integer()) -> future().
transaction_on_error({erlfdb_transaction, Tx}, Error) ->
    erlfdb_transaction_on_error(Tx, Error).


-spec transaction_reset(transaction()) -> ok.
transaction_reset({erlfdb_transaction, Tx}) ->
    erlfdb_transaction_reset(Tx).


-spec transaction_cancel(transaction()) -> ok.
transaction_cancel({erlfdb_transaction, Tx}) ->
    erlfdb_transaction_cancel(Tx).


-spec transaction_add_conflict_range(
        transaction(),
        StartKey::binary(),
        EndKey::binary(),
        ConflictType::conflict_type()
    ) -> ok.
transaction_add_conflict_range(
        {erlfdb_transaction, Tx},
        StartKey,
        EndKey,
        ConflictType
    ) ->
    erlfdb_transaction_add_conflict_range(Tx, StartKey, EndKey, ConflictType).


-spec transaction_get_next_tx_id(transaction()) -> non_neg_integer().
transaction_get_next_tx_id({erlfdb_transaction, Tx}) ->
    erlfdb_transaction_get_next_tx_id(Tx).


-spec transaction_is_read_only(transaction()) -> true | false.
transaction_is_read_only({erlfdb_transaction, Tx}) ->
    erlfdb_transaction_is_read_only(Tx).


-spec get_error(integer()) -> binary().
get_error(Error) ->
    erlfdb_get_error(Error).


-spec error_predicate(Predicate::error_predicate(), Error::integer()) ->
        boolean().
error_predicate(Predicate, Error) ->
    erlfdb_error_predicate(Predicate, Error).


init() ->
    PrivDir = case code:priv_dir(?MODULE) of
        {error, _} ->
            EbinDir = filename:dirname(code:which(?MODULE)),
            AppPath = filename:dirname(EbinDir),
            filename:join(AppPath, "priv");
        Path ->
            Path
    end,
    Status = erlang:load_nif(filename:join(PrivDir, "erlfdb_nif"), 0),
    if Status /= ok -> Status; true ->
        true = erlfdb_can_initialize(),

        Vsn = case application:get_env(erlfdb, api_version) of
            {ok, V} -> V;
            undefined -> ?DEFAULT_API_VERSION
        end,
        ok = select_api_version(Vsn),

        Opts = case application:get_env(erlfdb, network_options) of
            {ok, O} when is_list(O) -> O;
            undefined -> []
        end,

        lists:foreach(fun(Option) ->
            case Option of
                Name when is_atom(Name) ->
                    ok = network_set_option(Name, <<>>);
                {Name, Value} when is_atom(Name) ->
                    ok = network_set_option(Name, Value)
            end
        end, Opts),

        ok = erlfdb_setup_network()
    end.


-define(NOT_LOADED, erlang:nif_error({erlfdb_nif_not_loaded, ?FILE, ?LINE})).


-spec select_api_version(Version::pos_integer()) -> ok.
select_api_version(Version) when is_integer(Version), Version > 0 ->
    erlfdb_select_api_version(Version).


-spec network_set_option(Option::network_option(), Value::option_value()) ->
        ok | error().
network_set_option(Name, Value) ->
    BinValue = case Value of
        B when is_binary(B) -> B;
        I when is_integer(I) -> <<I:8/little-unsigned-integer-unit:8>>
    end,
    erlfdb_network_set_option(Name, BinValue).


% Sentinel Check
erlfdb_can_initialize() -> ?NOT_LOADED.


% Versioning
erlfdb_get_max_api_version() -> ?NOT_LOADED.
erlfdb_select_api_version(_Version) -> ?NOT_LOADED.

% Networking Setup
erlfdb_network_set_option(_NetworkOption, _Value) -> ?NOT_LOADED.
erlfdb_setup_network() -> ?NOT_LOADED.

% Futures
erlfdb_future_cancel(_Future) -> ?NOT_LOADED.
erlfdb_future_is_ready(_Future) -> ?NOT_LOADED.
erlfdb_future_get_error(_Future) -> ?NOT_LOADED.
erlfdb_future_get(_Future) -> ?NOT_LOADED.

% Databases
erlfdb_create_database(_ClusterFilePath) -> ?NOT_LOADED.
erlfdb_database_set_option(_Database, _DatabaseOption, _Value) -> ?NOT_LOADED.
erlfdb_database_create_transaction(_Database) -> ?NOT_LOADED.


% Transactions
erlfdb_transaction_set_option(
        _Transaction,
        _TransactionOption,
        _Value
    ) -> ?NOT_LOADED.
erlfdb_transaction_set_read_version(_Transaction, _Version) -> ?NOT_LOADED.
erlfdb_transaction_get_read_version(_Transaction) -> ?NOT_LOADED.
erlfdb_transaction_get(_Transaction, _Key, _Snapshot) -> ?NOT_LOADED.
erlfdb_transaction_get_key(
        _Transaction,
        _KeySelector,
        _Snapshot
    ) -> ?NOT_LOADED.
erlfdb_transaction_get_addresses_for_key(_Transaction, _Key) -> ?NOT_LOADED.
erlfdb_transaction_get_range(
        _Transaction,
        _StartKeySelector,
        _EndKeySelector,
        _Limit,
        _TargetBytes,
        _StreamingMode,
        _Iteration,
        _Snapshot,
        _Reverse
    ) -> ?NOT_LOADED.
erlfdb_transaction_set(_Transaction, _Key, _Value) -> ?NOT_LOADED.
erlfdb_transaction_clear(_Transaction, _Key) -> ?NOT_LOADED.
erlfdb_transaction_clear_range(_Transaction, _StartKey, _EndKey) -> ?NOT_LOADED.
erlfdb_transaction_atomic_op(
        _Transaction,
        _Mutation,
        _Key,
        _Value
    ) -> ?NOT_LOADED.
erlfdb_transaction_commit(_Transaction) -> ?NOT_LOADED.
erlfdb_transaction_get_committed_version(_Transaction) -> ?NOT_LOADED.
erlfdb_transaction_get_versionstamp(_Transaction) -> ?NOT_LOADED.
erlfdb_transaction_watch(_Transaction, _Key) -> ?NOT_LOADED.
erlfdb_transaction_on_error(_Transaction, _Error) -> ?NOT_LOADED.
erlfdb_transaction_reset(_Transaction) -> ?NOT_LOADED.
erlfdb_transaction_cancel(_Transaction) -> ?NOT_LOADED.
erlfdb_transaction_add_conflict_range(
        _Transaction,
        _StartKey,
        _EndKey,
        _Type
    ) -> ?NOT_LOADED.
erlfdb_transaction_get_next_tx_id(_Transaction) -> ?NOT_LOADED.
erlfdb_transaction_is_read_only(_Transaction) -> ?NOT_LOADED.


% Misc
erlfdb_get_error(_Error) -> ?NOT_LOADED.
erlfdb_error_predicate(_Predicate, _Error) -> ?NOT_LOADED.
