#!/bin/sh
# autopkgtest check: Build and run a program against ign-common, to verify that the
# headers and pkg-config file are installed correctly
# (C) 2012 Jose Luis Rivero
# Author: Jose Luis Rivero <jrivero@osrfoundation.org>

set -e

WORKDIR=$(mktemp -d)
trap "rm -rf $WORKDIR" 0 INT QUIT ABRT PIPE TERM
cd $WORKDIR
cat <<EOF > igntest.cc
#include <gflags/gflags.h>
#include <iostream>
#include <ignition/fuel_tools.hh>

DEFINE_bool(h, false, "Show help");

DEFINE_string(c, "", "Config file");
DEFINE_string(n, "", "Resource name");
DEFINE_string(o, "", "Owner name");
DEFINE_string(s, "", "Server name");
DEFINE_string(t, "", "Resource type (model / world)");

//////////////////////////////////////////////////
int main(int argc, char **argv)
{
  // Simple usage.
  std::string usage("Show details of a resource.");
  usage += " Usage:\n  ./igntest <options>\n\n";
  usage += "  Example:\n"
    "\t ./details -t model -o OpenRobotics -n Beer"
    "\t ./details -t world -s https://localhost:4430 -o OpenRobotics -n Empty"
    "\t ./details -c /tmp/my_config.yaml -o OpenRobotics -n Beer -t model";

  gflags::SetUsageMessage(usage);

  // Parse command line arguments.
  gflags::ParseCommandLineNonHelpFlags(&argc, &argv, true);

  // Show help, if specified.
  if (FLAGS_h || FLAGS_n == "" || (FLAGS_t != "model" && FLAGS_t != "world"))
  {
    gflags::SetCommandLineOptionWithMode("help", "false",
        gflags::SET_FLAGS_DEFAULT);
    gflags::SetCommandLineOptionWithMode("helpshort", "true",
        gflags::SET_FLAGS_DEFAULT);
    return 0;
  }
  gflags::HandleCommandLineHelpFlags();

  // Setup ClientConfig.
  ignition::fuel_tools::ClientConfig conf;
  conf.SetUserAgent("ExampleDetails");

  if (FLAGS_s != "")
  {
    // The user specified a Fuel server via command line.
    ignition::fuel_tools::ServerConfig srv;
    srv.SetUrl(ignition::common::URI(FLAGS_s));

    // Add the extra Fuel server.
    conf.AddServer(srv);
  }

  if (FLAGS_c != "")
  {
    if (!conf.LoadConfig(FLAGS_c))
    {
      std::cerr << "Error loading configuration file [" << FLAGS_c << "]"
                << std::endl;
      return -1;
    }
  }

  // Instantiate the FuelClient object with the configuration.
  ignition::fuel_tools::FuelClient client(conf);

  // Set the properties of the resource that we want to search.
  ignition::fuel_tools::ModelIdentifier modelIdentifier;
  ignition::fuel_tools::WorldIdentifier worldIdentifier;

  if (FLAGS_t == "model")
  {
    modelIdentifier.SetOwner(FLAGS_o);
    modelIdentifier.SetName(FLAGS_n);
  }
  else if (FLAGS_t == "world")
  {
    worldIdentifier.SetOwner(FLAGS_o);
    worldIdentifier.SetName(FLAGS_n);
  }

  // Fetch the details.
  for (const auto &server : client.Config().Servers())
  {
    if (FLAGS_t == "model")
    {
      // Set server
      auto id = modelIdentifier;
      id.SetServer(server);

      ignition::fuel_tools::ModelIdentifier model;
      if (!client.ModelDetails(id, model))
        continue;

      std::cout << model.AsPrettyString() << std::endl;
    }
    else if (FLAGS_t == "world")
    {
      // Set server
      auto id = worldIdentifier;
      id.SetServer(server);

      ignition::fuel_tools::WorldIdentifier world;
      if (!client.WorldDetails(id, world))
        continue;

      std::cout << world.AsPrettyString() << std::endl;
    }
  }

  return 0;
}
EOF

cat <<EOF > CMakeLists.txt
cmake_minimum_required(VERSION 3.5)

project(ign_test VERSION 1.0.0)

find_package(gflags REQUIRED)
find_package(ignition-fuel_tools7 7.0.0 REQUIRED)
include_directories(\${IGNITION-FUEL_TOOLS_INCLUDE_DIRS})
include_directories(\${IGNITION-COMMON_INCLUDE_DIRS})
add_executable(igntest igntest.cc)
target_link_libraries(igntest \${ignition-fuel_tools7_LIBRARIES} gflags)
EOF

cmake .
echo "configure cmake: OK"
VERBOSE=1 make
echo "build cmake:OK"
[ -x igntest ]
./igntest --help
echo "run: OK"

cat <<EOF > CMakeLists.txt
cmake_minimum_required(VERSION 3.5)

project(ign_test VERSION 1.0.0)

find_package(gflags REQUIRED)
find_package(ignition-fuel_tools7 7.0.0 REQUIRED)
add_executable(igntest igntest.cc)
target_link_libraries(igntest
   PUBLIC
      gflags
      ignition-fuel_tools7::ignition-fuel_tools7)
EOF

cmake .
echo "configure cmake with component: OK"
make
echo "build cmake component:OK"
[ -x igntest ]
./igntest --help
echo "run: OK"
