%% -*- coding: utf-8 -*-


%% @doc findfに対するインターフェース関数群.
-module(findf).

-export([start/0, start/1, stop/0]). % 開始と終了

-export([find_file/1, open_file/1, read_file/1]). %  ファイル操作

-export([get_dirs/0, set_dirs/1, add_to_dirs/1, remove_from_dirs/1, get_exts/0,
	 set_exts/1, add_to_exts/1, remove_from_exts/1]).

            % 状態の操作


% -compile(export_all).


%% @headerfile "../include/findf.hrl"
-include("../include/findf.hrl").

%% @headerfile "../include/findf_types.hrl"
-include("../include/findf_types.hrl").

-include("./findf_names.hrl").

%% @doc findfの開始.
%% @spec () -> {ok,Pid} | ignore | {error,Error}
%%   where
%%     Pid = pid()
%%     Error = term()
start() -> findf_server:start().

%% @doc 状態を引数に渡してfindfを開始
%% @spec (#sate{}) -> {ok,Pid} | ignore | {error,Error}
%%   where
%%     Pid = pid()
%%     Error = term()
start(InitState) -> findf_server:start(InitState).

%% @doc findfの停止.
%% @spec () -> none()
stop() -> gen_server:cast(?SERVER, stop).

%% @doc ファイル名の一部から、実在するファイルを探す.
%% @spec (string()) -> string()
%% @throws file_error()
find_file(Name) ->
    case gen_server:call(?SERVER, {find_file, Name}) of
      {ok, Value} -> Value;
      {error, Reason} -> throw(Reason)
    end.

%% @doc ファイル名の一部に対応するファイルがあれば開く.
%% @spec (string()) -> pid()
%% @throws file_error()
open_file(Name) ->
    case gen_server:call(?SERVER, {open_file, Name}) of
      {ok, Value} -> Value;
      {error, Reason} -> throw(Reason)
    end.

%% @doc ファイル名の一部に対応するファイルがあれば読む.
%% @spec (string()) -> binary()
%% @throws file_error()
read_file(Name) ->
    case gen_server:call(?SERVER, {read_file, Name}) of
      {ok, Value} -> Value;
      {error, Reason} -> throw(Reason)
    end.

%% @doc 現在保持しているディレクトリのリストを返す.
%% @spec () -> [string()]
get_dirs() -> gen_server:call(?SERVER, get_dirs).

%% @doc ディレクトリのリストをセットする.
%% @spec ([string()]) -> void()
set_dirs(Dirs) -> gen_server:call(?SERVER, {set_dirs, Dirs}).

%% @doc ディレクトリのリストにディレクトリを追加する.
%% @spec (string()) -> void()
add_to_dirs(Dir) -> gen_server:call(?SERVER, {add_to_dirs, Dir}).

%% @doc ディレクトリのリストからディレクトリを削除する.
%% @spec (string()) -> void()
remove_from_dirs(Dir) -> gen_server:call(?SERVER, {remove_from_dirs, Dir}).

%% @doc 現在保持している拡張子のリストを返す.
%% @spec () -> [string()]
get_exts() -> gen_server:call(?SERVER, get_exts).

%% @doc 拡張子のリストをセットする.
%% @spec ([string()]) -> void()
set_exts(Exts) -> gen_server:call(?SERVER, {set_exts, Exts}).

%% @doc 拡張子のリストに拡張子を追加する.
%% @spec (string()) -> void()
add_to_exts(Ext) -> gen_server:call(?SERVER, {add_to_exts, Ext}).

%% @doc 拡張子のリストから拡張子を削除する.
%% @spec (string()) -> void()
remove_from_exts(Ext) -> gen_server:call(?SERVER, {remove_from_exts, Ext}).