% 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(chttpd_view).
-include_lib("couch/include/couch_db.hrl").
-include_lib("couch_views/include/couch_views.hrl").

-export([
    handle_view_req/3,
    validate_args/2,
    parse_queries/4,
    view_cb/2
]).

-define(DEFAULT_ALL_DOCS_PAGE_SIZE, 2000).
-define(DEFAULT_VIEWS_PAGE_SIZE, 2000).

multi_query_view(Req, Db, DDoc, ViewName, Queries) ->
    Args = couch_views_http:parse_params(Req, undefined),
    case couch_views_util:is_paginated(Args) of
        false ->
            stream_multi_query_view(Req, Db, DDoc, ViewName, Args, Queries);
        true ->
            paginate_multi_query_view(Req, Db, DDoc, ViewName, Args, Queries)
    end.


stream_multi_query_view(Req, Db, DDoc, ViewName, Args0, Queries) ->
    {ok, #mrst{views=Views}} = couch_views_util:ddoc_to_mrst(Db, DDoc),
    Args1 = couch_views_util:set_view_type(Args0, ViewName, Views),
    ArgQueries = parse_queries(Req, Args1, Queries, fun(QueryArg) ->
        couch_views_util:set_view_type(QueryArg, ViewName, Views)
    end),
    VAcc0 = #vacc{db=Db, req=Req, prepend="\r\n"},
    FirstChunk = "{\"results\":[",
    {ok, Resp0} = chttpd:start_delayed_json_response(VAcc0#vacc.req, 200, [], FirstChunk),
    VAcc1 = VAcc0#vacc{resp=Resp0},
    VAcc2 = lists:foldl(fun(Args, Acc0) ->
        Fun = fun view_cb/2,
        {ok, Acc1} = couch_views:query(Db, DDoc, ViewName, Fun, Acc0, Args),
        Acc1
    end, VAcc1, ArgQueries),
    {ok, Resp1} = chttpd:send_delayed_chunk(VAcc2#vacc.resp, "\r\n]}"),
    chttpd:end_delayed_json_response(Resp1).


paginate_multi_query_view(Req, Db, DDoc, ViewName, Args0, Queries) ->
    {ok, #mrst{views=Views}} = couch_views_util:ddoc_to_mrst(Db, DDoc),
    ArgQueries = parse_queries(Req, Args0, Queries, fun(QueryArg) ->
        couch_views_util:set_view_type(QueryArg, ViewName, Views)
    end),
    KeyFun = fun({Props}) ->
        {couch_util:get_value(id, Props), couch_util:get_value(key, Props)}
    end,
    #mrargs{page_size = PageSize} = Args0,
    #httpd{path_parts = Parts} = Req,
    UpdateSeq = fabric2_db:get_update_seq(Db),
    EtagTerm = {Parts, UpdateSeq, Args0},
    Response = couch_views_http:paginated(
        Req, EtagTerm, PageSize, ArgQueries, KeyFun,
        fun(Args) ->
           {ok, #vacc{meta=MetaMap, buffer=Items}} = couch_views:query(
               Db, DDoc, ViewName, fun view_cb/2, #vacc{paginated=true}, Args),
           {MetaMap, Items}
        end),
    chttpd:send_json(Req, Response).


design_doc_post_view(Req, Props, Db, DDoc, ViewName, Keys) ->
    Args = couch_views_http_util:parse_body_and_query(Req, Props, Keys),
    fabric_query_view(Db, Req, DDoc, ViewName, Args).

design_doc_view(Req, Db, DDoc, ViewName, Keys) ->
    Args = couch_views_http:parse_params(Req, Keys),
    fabric_query_view(Db, Req, DDoc, ViewName, Args).


fabric_query_view(Db, Req, DDoc, ViewName, Args) ->
    case couch_views_util:is_paginated(Args) of
        false ->
            stream_fabric_query_view(Db, Req, DDoc, ViewName, Args);
        true ->
            paginate_fabric_query_view(Db, Req, DDoc, ViewName, Args)
    end.


stream_fabric_query_view(Db, Req, DDoc, ViewName, Args) ->
    Max = chttpd:chunked_response_buffer_size(),
    Fun = fun view_cb/2,
    VAcc = #vacc{db=Db, req=Req, threshold=Max},
    {ok, Resp} = couch_views:query(Db, DDoc, ViewName, Fun, VAcc, Args),
    {ok, Resp#vacc.resp}.


paginate_fabric_query_view(Db, Req, DDoc, ViewName, Args0) ->
    KeyFun = fun({Props}) ->
        {couch_util:get_value(id, Props), couch_util:get_value(key, Props)}
    end,
    #httpd{path_parts = Parts} = Req,
    UpdateSeq = fabric2_db:get_update_seq(Db),
    ETagTerm = {Parts, UpdateSeq, Args0},
    Response = couch_views_http:paginated(
        Req, ETagTerm, Args0, KeyFun,
        fun(Args) ->
            VAcc0 = #vacc{paginated=true},
            {ok, VAcc1} = couch_views:query(Db, DDoc, ViewName, fun view_cb/2, VAcc0, Args),
            #vacc{meta=Meta, buffer=Items} = VAcc1,
            {Meta, Items}
        end),
    chttpd:send_json(Req, Response).

view_cb({row, Row} = Msg, Acc) ->
    case lists:keymember(doc, 1, Row) of
        true -> chttpd_stats:incr_reads();
        false -> ok
    end,
    chttpd_stats:incr_rows(),
    couch_views_http:view_cb(Msg, Acc);

view_cb(Msg, Acc) ->
    couch_views_http:view_cb(Msg, Acc).


handle_view_req(#httpd{method='POST',
    path_parts=[_, _, _, _, ViewName, <<"queries">>]}=Req, Db, DDoc) ->
    chttpd:validate_ctype(Req, "application/json"),
    Props = couch_httpd:json_body_obj(Req),
    case couch_views_util:get_view_queries(Props) of
        undefined ->
            throw({bad_request,
                <<"POST body must include `queries` parameter.">>});
        Queries ->
            multi_query_view(Req, Db, DDoc, ViewName, Queries)
    end;

handle_view_req(#httpd{path_parts=[_, _, _, _, _, <<"queries">>]}=Req,
    _Db, _DDoc) ->
    chttpd:send_method_not_allowed(Req, "POST");

handle_view_req(#httpd{method='GET',
        path_parts=[_, _, _, _, ViewName]}=Req, Db, DDoc) ->
    couch_stats:increment_counter([couchdb, httpd, view_reads]),
    Keys = chttpd:qs_json_value(Req, "keys", undefined),
    design_doc_view(Req, Db, DDoc, ViewName, Keys);

handle_view_req(#httpd{method='POST',
        path_parts=[_, _, _, _, ViewName]}=Req, Db, DDoc) ->
    chttpd:validate_ctype(Req, "application/json"),
    Props = couch_httpd:json_body_obj(Req),
    assert_no_queries_param(couch_views_util:get_view_queries(Props)),
    Keys = couch_views_util:get_view_keys(Props),
    couch_stats:increment_counter([couchdb, httpd, view_reads]),
    design_doc_post_view(Req, Props, Db, DDoc, ViewName, Keys);

handle_view_req(Req, _Db, _DDoc) ->
    chttpd:send_method_not_allowed(Req, "GET,POST,HEAD").


% See https://github.com/apache/couchdb/issues/2168
assert_no_queries_param(undefined) ->
    ok;
assert_no_queries_param(_) ->
    throw({
        bad_request,
        "The `queries` parameter is no longer supported at this endpoint"
    }).


validate_args(Req, #mrargs{page_size = PageSize} = Args) when is_integer(PageSize) ->
    MaxPageSize = max_page_size(Req),
    couch_views_util:validate_args(Args, [{page_size, MaxPageSize}]);

validate_args(_Req, #mrargs{} = Args) ->
    couch_views_util:validate_args(Args, []).


max_page_size(#httpd{path_parts=[_Db, <<"_all_docs">>, <<"queries">>]}) ->
    config:get_integer(
        "request_limits", "_all_docs/queries", ?DEFAULT_ALL_DOCS_PAGE_SIZE);

max_page_size(#httpd{path_parts=[_Db, <<"_all_docs">>]}) ->
    config:get_integer(
        "request_limits", "_all_docs", ?DEFAULT_ALL_DOCS_PAGE_SIZE);

max_page_size(#httpd{path_parts=[_Db, <<"_local_docs">>, <<"queries">>]}) ->
    config:get_integer(
        "request_limits", "_all_docs/queries", ?DEFAULT_ALL_DOCS_PAGE_SIZE);

max_page_size(#httpd{path_parts=[_Db, <<"_local_docs">>]}) ->
    config:get_integer(
        "request_limits", "_all_docs", ?DEFAULT_ALL_DOCS_PAGE_SIZE);

max_page_size(#httpd{path_parts=[_Db, <<"_design_docs">>, <<"queries">>]}) ->
    config:get_integer(
        "request_limits", "_all_docs/queries", ?DEFAULT_ALL_DOCS_PAGE_SIZE);

max_page_size(#httpd{path_parts=[_Db, <<"_design_docs">>]}) ->
    config:get_integer(
        "request_limits", "_all_docs", ?DEFAULT_ALL_DOCS_PAGE_SIZE);

max_page_size(#httpd{path_parts=[
        _Db, <<"_design">>, _DDocName, <<"_view">>, _View, <<"queries">>]}) ->
    config:get_integer(
        "request_limits", "_view/queries", ?DEFAULT_VIEWS_PAGE_SIZE);

max_page_size(#httpd{path_parts=[
        _Db, <<"_design">>, _DDocName, <<"_view">>, _View]}) ->
    config:get_integer(
        "request_limits", "_view", ?DEFAULT_VIEWS_PAGE_SIZE).


parse_queries(Req, #mrargs{page_size = PageSize} = Args0, Queries, Fun)
        when is_integer(PageSize) ->
    MaxPageSize = max_page_size(Req),
    if length(Queries) < PageSize -> ok; true ->
        throw({
            query_parse_error,
            <<"Provided number of queries is more than given page_size">>
        })
    end,
    couch_views_util:validate_args(Fun(Args0), [{page_size, MaxPageSize}]),
    Args = Args0#mrargs{page_size = undefined},
    lists:map(fun({Query}) ->
        Args1 = couch_views_http:parse_params(Query, undefined, Args, [decoded]),
        if not is_integer(Args1#mrargs.page_size) -> ok; true ->
            throw({
               query_parse_error,
                <<"You cannot specify `page_size` inside the query">>
            })
        end,
        Args2 = maybe_set_page_size(Args1, MaxPageSize),
        couch_views_util:validate_args(Fun(Args2), [{page_size, MaxPageSize}])
    end, Queries);

parse_queries(_Req, #mrargs{} = Args, Queries, Fun) ->
    lists:map(fun({Query}) ->
        Args1 = couch_views_http:parse_params(Query, undefined, Args, [decoded]),
        couch_views_util:validate_args(Fun(Args1))
    end, Queries).


maybe_set_page_size(#mrargs{page_size = undefined} = Args, MaxPageSize) ->
    Args#mrargs{page_size = MaxPageSize};

maybe_set_page_size(#mrargs{} = Args, _MaxPageSize) ->
    Args.


-ifdef(TEST).

-include_lib("eunit/include/eunit.hrl").


check_multi_query_reduce_view_overrides_test_() ->
    {
        setup,
        fun setup_all/0,
        fun teardown_all/1,
        {
            foreach,
            fun setup/0,
            fun teardown/1,
            [
                t_check_include_docs_throw_validation_error(),
                t_check_user_can_override_individual_query_type()
            ]
        }
    }.


t_check_include_docs_throw_validation_error() ->
    ?_test(begin
        Req = #httpd{qs = []},
        Db = #{name => <<"foo">>},
        Query = {[{<<"include_docs">>, true}]},
        Throw = {query_parse_error, <<"`include_docs` is invalid for reduce">>},
        ?assertThrow(Throw, multi_query_view(Req, Db, ddoc, <<"v">>, [Query]))
    end).


t_check_user_can_override_individual_query_type() ->
    ?_test(begin
        Req = #httpd{qs = []},
        Db = #{name => <<"foo">>},
        Query = {[{<<"include_docs">>, true}, {<<"reduce">>, false}]},
        multi_query_view(Req, Db, ddoc, <<"v">>, [Query]),
        ?assertEqual(1, meck:num_calls(chttpd, start_delayed_json_response, '_'))
    end).


setup_all() ->
    Views = [#mrview{reduce_funs = [{<<"v">>, <<"_count">>}]}],
    meck:expect(couch_views_util, ddoc_to_mrst, 2, {ok, #mrst{views = Views}}),
    meck:expect(chttpd, start_delayed_json_response, 4, {ok, resp}),
    meck:expect(couch_views, query, 6, {ok, #vacc{}}),
    meck:expect(chttpd, send_delayed_chunk, 2, {ok, resp}),
    meck:expect(chttpd, end_delayed_json_response, 1, ok).


teardown_all(_) ->
    meck:unload().


setup() ->
    meck:reset([
        chttpd,
        couch_views,
        couch_views_util
    ]).


teardown(_) ->
    ok.


-endif.
