-module(couch_cost).

-export([
    inc_doc/0, inc_doc/1, inc_doc/2,
    inc_ioq/0, inc_ioq/1, inc_ioq/2,
    inc_get_node/1,
    inc_db_open/0,
    inc_js_filter/0, inc_js_filter/1, inc_js_filter/2,
    inc_js_filtered_docs/1, inc_js_filtered_docs/2,
    inc_changes_processed/0, inc_changes_processed/1, inc_changes_processed/2
    %%io_bytes_read/1, io_bytes_read/2,
    %%io_bytes_written/1, io_bytes_written/2,
    %%inc_js_evals/0, inc_js_evals/1, inc_js_evals/2
]).

-export([
    get_cost/0,
    get_costs/0,
    accumulate_costs/1
]).


-record(cost, {
    db_open = 0,
    docs_read = 0,
    changes_processed = 0,
    ioq_calls = 0,
    io_bytes_read = 0,
    io_bytes_written = 0,
    js_evals = 0,
    js_filter = 0,
    js_filtered_docs = 0,
    get_kv_node = 0,
    get_kp_node = 0
}).

get_cost() ->
    case get(cost_accounting_context) of
        undefined ->
            Cost = #cost{},
            update_cost(Cost),
            Cost;
        #cost{}=Cost ->
            Cost
    end.

get_costs() ->
    case get(cost_accounting_context_aggregation) of
        undefined ->
            Costs = [],
            put(cost_accounting_context_aggregation, Costs),
            Costs;
        Costs when is_list(Costs) ->
            Costs
    end.

update_cost(#cost{}=Cost) ->
    put(cost_accounting_context, Cost).

accumulate_costs(#cost{}=Cost) ->
    Costs = get_costs(),
    put(cost_accounting_context_aggregation, [Cost | Costs]).

inc_doc() -> inc_doc(1).
inc_doc(N) -> inc_doc(N, get_cost()).
inc_doc(N, #cost{docs_read=DR0}=Cost) -> update_cost(Cost#cost{docs_read=DR0+N}).

inc_ioq() -> inc_ioq(1).
inc_ioq(N) -> inc_ioq(N, get_cost()).
inc_ioq(N, #cost{ioq_calls=IOQ0}=Cost) -> update_cost(Cost#cost{ioq_calls=IOQ0+N}).


inc_get_node(Type) when Type =:= kp_node orelse Type =:= kv_node ->
%%inc_get_node(Type) when Type =:= kp_node; Type =:= kv_node ->
    update_cost(inc(Type, get_cost())).


inc_js_filter() -> inc_js_filter(1).
inc_js_filter(N) -> inc_js_filter(N, get_cost()).
inc_js_filter(N, #cost{}=Cost) -> update_cost(inc(js_filter, Cost, N)).


inc_js_filtered_docs(N) -> inc_js_filtered_docs(N, get_cost()).
inc_js_filtered_docs(N, #cost{}=Cost) -> update_cost(inc(js_filtered_docs, Cost, N)).


inc_changes_processed() -> inc_changes_processed(1).
inc_changes_processed(N) -> inc_changes_processed(N, get_cost()).
inc_changes_processed(N, #cost{}=Cost) -> update_cost(inc(changes_processed, Cost, N)).


inc_db_open() -> inc_db_open(1).
inc_db_open(N) -> inc_db_open(N, get_cost()).
inc_db_open(N, #cost{}=Cost) -> update_cost(inc(db_open, Cost, N)).


inc(Key, Cost) ->
    inc(Key, Cost, 1).


inc(kp_node, #cost{get_kp_node=GKP}=Cost, N) ->
    Cost#cost{get_kp_node = GKP + N};
inc(kv_node, #cost{get_kv_node=GKV}=Cost, N) ->
    Cost#cost{get_kv_node = GKV + N};
inc(changes_processed, #cost{changes_processed=CP}=Cost, N) ->
    Cost#cost{changes_processed = CP + N};
inc(db_open, #cost{db_open=DBO}=Cost, N) ->
    Cost#cost{db_open = DBO + N};
inc(js_filter, #cost{js_filter=JSF}=Cost, N) ->
    Cost#cost{js_filter = JSF + N};
inc(js_filtered_docs, #cost{js_filtered_docs=JSFD}=Cost, N) ->
    Cost#cost{js_filtered_docs = JSFD + N}.
