# -*- coding: utf-8 -*-
# ------------------------------------------------------------------------------
#
#   Copyright 2018-2019 Fetch.AI Limited
#
#   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.
#
# ------------------------------------------------------------------------------

"""Training a multi armed bandit rl agent using the aea framework."""

import argparse

from gyms.env import BanditNArmedRandom  # noqa: I201
from proxy.env import ProxyEnv  # noqa: I201
from rl.agent import RLAgent  # noqa: I201


DEFAULT_NB_GOODS = 10
DEFAULT_NB_PRICES_PER_GOOD = 100
DEFAULT_NB_STEPS = 4000

parser = argparse.ArgumentParser("train", description="Train an RL agent.")
parser.add_argument(
    "--nb-steps",
    type=int,
    default=DEFAULT_NB_STEPS,
    help="The number of training steps.",
)
parser.add_argument(
    "--nb-goods", type=int, default=DEFAULT_NB_GOODS, help="The number of goods."
)
parser.add_argument(
    "--nb-prices-per-good",
    type=int,
    default=DEFAULT_NB_PRICES_PER_GOOD,
    help="The number of prices per goods.",
)


if __name__ == "__main__":
    arguments = parser.parse_args()

    # Use any gym.Env compatible environment:
    gym_env = BanditNArmedRandom(
        nb_bandits=arguments.nb_goods, nb_prices_per_bandit=arguments.nb_prices_per_good
    )

    # Pass the gym environment to a proxy environment:
    proxy_env = ProxyEnv(gym_env)

    # Use any RL agent compatible with the gym environment and call the fit method:
    rl_agent = RLAgent(nb_goods=arguments.nb_goods)
    rl_agent.fit(env=proxy_env, nb_steps=arguments.nb_steps)
