require "chatwork/version"
require "hashie"

module ChatWork
  autoload :BaseClient,         "chatwork/base_client"
  autoload :APIConnectionError, "chatwork/chatwork_error"
  autoload :APIError,           "chatwork/chatwork_error"
  autoload :AuthenticateError,  "chatwork/chatwork_error"
  autoload :ChatWorkError,      "chatwork/chatwork_error"
  autoload :Client,             "chatwork/client"
  autoload :Contacts,           "chatwork/contacts"
  autoload :EntityMethods,      "chatwork/entity_methods"
  autoload :File,               "chatwork/file"
  autoload :IncomingRequest,    "chatwork/incoming_request"
  autoload :InvitationLink,     "chatwork/invitation_link"
  autoload :Me,                 "chatwork/me"
  autoload :Member,             "chatwork/member"
  autoload :Message,            "chatwork/message"
  autoload :MyStatus,           "chatwork/my_status"
  autoload :MyTask,             "chatwork/my_task"
  autoload :OAuthClient,        "chatwork/oauth_client"
  autoload :Room,               "chatwork/room"
  autoload :Task,               "chatwork/task"
  autoload :Token,              "chatwork/token"

  @api_base = "https://api.chatwork.com/"
  @oauth_api_base = "https://oauth.chatwork.com/"
  @api_version = "/v2"
  @api_key = nil
  @access_token = nil
  @client_id = nil
  @client_secret = nil

  class << self
    attr_reader :api_base

    attr_reader :oauth_api_base

    attr_reader :api_version

    def client
      @client ||= Client.new(api_key, access_token, api_base, api_version)
    end

    def oauth_client
      @oauth_client ||= OAuthClient.new(client_id, client_secret, oauth_api_base)
    end

    def api_base=(new_value)
      @api_base = new_value
      @client = nil
    end

    def oauth_api_base=(new_value)
      @oauth_api_base = new_value
      @oauth_client = nil
    end

    def api_key=(new_value)
      @api_key = new_value
      @access_token = nil
      @client = nil
    end

    def access_token=(new_value)
      @api_key = nil
      @access_token = new_value
      @client = nil
    end

    def client_id=(new_value)
      @client_id = new_value
      @oauth_client = nil
    end

    def client_secret=(new_value)
      @client_secret = new_value
      @oauth_client = nil
    end

    def api_key
      @api_key || ENV["CHATWORK_API_TOKEN"]
    end

    def access_token
      @access_token || ENV["CHATWORK_ACCESS_TOKEN"]
    end

    def client_id
      @client_id || ENV["CHATWORK_CLIENT_ID"]
    end

    def client_secret
      @client_secret || ENV["CHATWORK_CLIENT_SECRET"]
    end
  end
end