#include "TradingVideoSupplier.h"

TradingVideoSupplier::TradingVideoSupplier (const char *name, const CORBA::Boolean store)
  : VideoSupplier (name, store)
{
  // Note: the base class constructor will add this video supplier to the service provider's collection.
}

/*
 * @func exports the managed video categories and titles
 * @parm | lookup | reference to trader lookup interface
 */
CORBA::Boolean
TradingVideoSupplier::exportOffer (CosTrading::Lookup_ptr lookup)
{
  // Arbitary video base cost.
  float basePrice = 25.8f;

  CosTrading::Register_var registerVar = lookup->register_if ();
  if (CORBA::is_nil (registerVar.in ()))
    {
      ACE_ERROR ((LM_ERROR, ACE_TEXT ("ERROR: Null register\n")));
      return 0;
    }

  CORBA::Object_var objVar = this->_this ();
  if (CORBA::is_nil (objVar.in ()))
    {
      ACE_ERROR ((LM_ERROR, ACE_TEXT ("ERROR: Null servant reference\n")));
      return 0;
    }

  CosTrading::PropertySeq properties;
  properties.length (3);

  StringArray *array;
  for (ASA_Iter itb = ASA_Iter (videos_);
       itb.next (array) != 0; itb.advance ())
    {
      int videos = 0;
      char **offer = 0;
      for (StringArray::ITERATOR itb2 = StringArray::ITERATOR (*array);
           itb2.next (offer) != 0; itb2.advance ())
        {
          // Randomise video cost.
          float inc = (float (rand ()) / RAND_MAX) * 10.0f;
          if ((int) inc > 5)
            {
              inc *= -1.0f;
            }
          basePrice += inc;
          if ((int) basePrice < 10)
            {
              basePrice = 10.0f;
            }

          // Populate offer properties.
          if (videos > 0)
            {
              ACE_DEBUG ((LM_DEBUG,
                          ACE_TEXT ("INFO: Category: %s, Title: %s, Cost: %.2f\n"),
                          (*array)[0], (*offer), basePrice));

              // Video category/type.
              CORBA::String_var catVar = CORBA::string_dup ((*array)[0]);
              properties[0].name = CORBA::string_dup (ACE_TEXT ("type"));
              properties[0].value <<= catVar;

              // Video title.
              CORBA::String_var titleVar = CORBA::string_dup ((*offer));
              properties[1].name = CORBA::string_dup (ACE_TEXT ("title"));
              properties[1].value <<= titleVar;

              // Video cost.
              properties[2].name = CORBA::string_dup (ACE_TEXT ("cost"));
              properties[2].value <<= basePrice;

              ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("About to export offers\n")));
              CosTrading::OfferId_var offer_id =
                registerVar->_cxx_export (objVar.in (), ACE_TEXT ("IDL:video_supplier:1.0"), properties);
              ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Successfully exported offers\n")));

              ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("INFO: exported: %s\n"), offer_id.in ()));
            }

          ++videos;
        }
    }

  return 1;
}

/*
 * @func clean all the videos that were exported in previous runs
 * @parm | lookup | reference to trader lookup interface
 */
void
TradingVideoSupplier::cleanAllOffers (CosTrading::Lookup_ptr lookup)
{
  CosTrading::Register_var registerVar = lookup->register_if ();
  if (CORBA::is_nil (registerVar.in ()))
    {
      ACE_ERROR ((LM_ERROR, ACE_TEXT ("ERROR: Null register\n")));
    }

  ACE_DEBUG ((LM_DEBUG,
              ACE_TEXT ("Cleaning old offers\n")));
  registerVar->withdraw_using_constraint (ACE_TEXT ("IDL:video_supplier:1.0"), ACE_TEXT ("TRUE"));
}
