# coding:utf-8
"""
   REST API for data search
   Copyright © 2020 JASRI All Rights Reserved.
"""
import json
import requests
from . import config
from . import util
[docs]class Main():
    def __init__(self, parent):
        self.__parent = parent
        self.directories = Directories(self)
        self.files = Files(self)
        self.register_names = RegisterNames(self)
        self.metadata = Metadata(self)
[docs]    def endpoint(self, path):
        return self.__parent.endpoint(path) 
[docs]    def access_token(self):
        return self.__parent.access_token()  
[docs]class Directories():
    def __init__(self, parent):
        self.__parent = parent
        self.__endpoint = parent.endpoint(config.data_directories_path)
[docs]    def post(self, **v):
        """
        REST API: ディレクトリ検索
        * Endpoint: [agent-url]/benten/v1/data/directories
        * Method: POST
        * Response: JSON
        * Authorization: 要
        :param \**v:
            See below.
            :Keyword Arguments:
            * *begindate*  (``str`` [Option]) ; 検索日時の始まり
                * ex.: 2017-04-05 00:00:00
            * *enddate*  (``str`` [Option]) :  検索日時の終わり
                * ex.: 2017-07-25 00:00:00
            * *query* (``str`` [Option]) :  検索クエリ
            * *size* (``int`` [Option]) :  検索件数
                * 省略時は全検索
                * sizeが負の場合、返答において total_countのみ返す
            * *begin_from*  (``int`` [Option]) :  検索の始まりのID     
            * *flag_own*  (``int`` [Option]) : 自身の所属のデータのみ検索するかどうかのフラグ
                * 0 (default, disable) or 1  (enable)
        :return:
            A dict of mapping keys.
            :Keyword:
                * *total_count* (``int``) :  全検索数 (Elasticsearchの登録テーブル件数)
                * *begin_from* (``int``) :  入力時に指定した begn_from値
                * *size* (``int``)  : 入力時に指定した size値
                * *register_name_list* (``list(str)``) :  登録名リスト
                * *directory_list* (``list(str)``) :  ディレクトリリスト
                * *error* (``dict``) : エラー情報 (エラー発生時のみ付加)
        """
        vdata = {}
        for key in ["begindate", "enddate", "query", "size", "begin_from", "flag_own"]:
            if key in v:
                vdata[key] = v[key]
        ret = requests.post(self.__endpoint, vdata, verify=False,
                            headers=util.headers_authorization(self.__parent.access_token()))
        return util.json_response(ret)  
[docs]class Files():
    def __init__(self, parent):
        self.__parent = parent
        self.__endpoint = parent.endpoint(config.data_files_path)
[docs]    def post(self, **v):
        """
        REST API: ファイル検索
        * Endpoint: [agent-url]/benten/v1/data/files
        * Method: POST
        * Response: JSON
        * Authorization: 要
        :param \**v:
            See below.
             :Keyword Arguments:
                 * *register_name_list* (``list(str)`` [Option]) :  登録名リスト
                 * *file_list* (``list(str)`` [Option]) :  ファイルまたはディレクトリリスト
                 * *query*  (``str`` [Option]) : 	検索クエリ
                 * *flag_recursive* (``int`` [Option]) :  ディレクトリ指定時に下位ディレクトリを含めて検索するかどうかを示すフラグ
                    * デフォルト値は0, 1の時に有効になる
                 * *flag_register_name* (``int`` [Option]) :  出力に登録名リストも含むかどうかを示すフラグ
                    * デフォルト値は0、1の時に有効になる
                 * *flag_uuid_register_directory* (``int`` [Option]) :  ファイル出力にuuid_register_directoryも含むかどうかを示すフラグ
                    * デフォルト値は0、1の時に有効になる
                 * *size* (``int`` [Option]) :  検索件数
                        * 省略時は全検索
                 * *begin_from*  (``int`` [Option]) :  検索の始まりのID
                 * *flag_own*  (``int`` [Option]) : 自身の所属のデータのみ検索するかどうかのフラグ
                     * デフォルト値は0、1の時に有効になる
            (注) :  register_name_list または  file_list の入力が必要 (両方入力の場合はANDで検索)
        :return:
            A dict of mapping keys.
            :Keyword:
                * *total_count* (``int``) :  全検索数 (Elasticsearchの登録テーブル件数)
                * *begin_from* (``int``) :  入力時に指定した begn_from値
                * *size* (``int``)  : 入力時に指定した size値
                * *file_list*  (``list(dict)``) : 	ファイル辞書のリスト
                * *error* (``dict``) : エラー情報 (エラー発生時のみ付加)
        """
        vdata = {}
        for key in ["register_name_list", "file_list", "directory_list", "query", 
                    "flag_recursive", "flag_register_name", "flag_uuid_register_directory",
                    "size", "begin_from", "flag_own"]:
            if key in v:
                vdata[key] = v[key]
        ret = requests.post(self.__endpoint, vdata, verify=False,
                            headers=util.headers_authorization(self.__parent.access_token()))
        return util.json_response(ret)  
[docs]class RegisterNames():
    def __init__(self, parent):
        self.__parent = parent
        self.__endpoint = parent.endpoint(config.data_register_names_path)
[docs]    def post(self, **v):
        """
        REST API: 登録名の検索
        * Endpoint: [benten-url]/benten/v1/data/register_names
        * Method: POST
        * Response: JSON
        * Authorization: 要
        :param \**v:
            See below.
             :Keyword Arguments:
                 * *file_list* (``list(str)``) :  ディレクトリまたはファイルのリスト
                 * *query*  (``str`` [Option]) : 	検索クエリ
                 * *flag_recursive* (``int`` [Option]) :  ディレクトリ指定時に下位ディレクトリを含めて検索するかどうかのフラグ
                 * *size* (``int`` [Option]) :  検索件数
                        * 省略時は全検索
                 * *begin_from*  (``int`` [Option]) :  検索の始まりのID
                 * *flag_own*  (``int`` [Option]) : 自身の所属のデータのみ検索するかどうかのフラグ
                     * デフォルト値は0、1の時に有効になる
        :return:
            A dict of mapping keys.
            :Keyword:
                * *total_count* (``int``) :  全検索数 (Elasticsearchの登録テーブル件数)
                * *begin_from* (``int``) :  入力時に指定した begn_from値
                * *size* (``int``)  : 入力時に指定した size値
                * *register_name_list*  (``list(dict)``) : register_nameのリスト
                * *error* (``dict``) : エラー情報 (エラー発生時のみ付加)
        """
        vdata = {}
        for key in ["file_list", "query", "flag_recursive",
                    "size", "begin_from", "flag_own"]:
            if key in v:
                vdata[key] = v[key]
        ret = requests.post(self.__endpoint, vdata, verify=False,
                            headers=util.headers_authorization(self.__parent.access_token()))
        return util.json_response(ret)