#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/applications-module.h"
#include "ns3/wifi-module.h"
#include "ns3/mobility-module.h"
#include "ns3/internet-module.h"
#include "ns3/NDNabstraction-module.h"

using namespace ns3;

NS_LOG_COMPONENT_DEFINE ("ThirdScriptExample");

int 
main (int argc, char *argv[])
{
  CommandLine cmd;
  cmd.Parse (argc,argv);
  NodeContainer producerNode;
  producerNode.Create (1);
  NodeContainer consumerNode;
  consumerNode.Create(1);
  YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();
  YansWifiPhyHelper phy = YansWifiPhyHelper::Default ();
  phy.SetChannel (channel.Create ());
  WifiHelper wifi = WifiHelper::Default ();
  wifi.SetRemoteStationManager ("ns3::AarfWifiManager");
  NqosWifiMacHelper mac = NqosWifiMacHelper::Default ();
  /*Ssid ssid = Ssid ("ns-3-ssid");
  mac.SetType ("ns3::StaWifiMac",
               "Ssid", SsidValue (ssid),
               "ActiveProbing", BooleanValue (false));*/
  mac.SetType("ns3::AdhocWifiMac");
  NetDeviceContainer producerDevices;
  producerDevices = wifi.Install (phy, mac, producerNode);
  /*mac.SetType ("ns3::ApWifiMac",
               "Ssid", SsidValue (ssid));
  */
  NetDeviceContainer consumerDevices;
  consumerDevices = wifi.Install (phy, mac, consumerNode);

  MobilityHelper mobility;
  mobility.SetPositionAllocator ("ns3::GridPositionAllocator",
                                 "MinX", DoubleValue (0.0),
                                 "MinY", DoubleValue (0.0),
                                 "DeltaX", DoubleValue (300.0),
                                 "DeltaY", DoubleValue (10.0),
                                 "GridWidth", UintegerValue (3),
                                 "LayoutType", StringValue ("RowFirst"));
  mobility.SetMobilityModel("ns3::ConstantVelocityMobilityModel",
			    "ConstantVelocity", VectorValue(Vector(26.8224, 0, 0)));
  mobility.Install (producerNode);

  mobility.SetMobilityModel("ns3::ConstantVelocityMobilityModel",
			    "ConstantVelocity", VectorValue(Vector(-26.8224, 0, 0)));
  mobility.Install (consumerNode);


  // 1. Set RoutingHelper to support prefix
  //InternetStackHelper stack;
  //Ipv4GlobalRoutingHelper ipv4RoutingHelper ("ns3::Ipv4GlobalRoutingOrderedNexthops");
  //stack.SetRoutingHelper (ipv4RoutingHelper);

  // 2. Install CCNx stack
  NS_LOG_INFO ("Installing CCNx stack");
  CcnxStackHelper ccnxHelper;
  std::string strategy = "ns3::CcnxFloodingStrategy";
  ccnxHelper.SetForwardingStrategy (strategy);
  ccnxHelper.SetDefaultRoutes(true);
  //ccnxHelper.EnableLimits (false, Seconds(0.1));
  ccnxHelper.InstallAll ();

  // 3. Install IP stack
  //stack.Install (consumerNode);
  //stack.Install (producerNode);

  // 4. Assign Addresses
  //Ipv4AddressHelper address;
  //address.SetBase ("10.1.3.0", "255.255.255.0");
  //address.Assign (consumerDevices);
  //Ipv4InterfaceContainer producerInterface = address.Assign (producerDevices);

  // 5. Populate FIB based on IPv4 global routing controller
  //ccnxHelper.InstallFakeGlobalRoutes ();
  //ccnxHelper.InstallRouteTo (producerNode.Get(0));

  // 6. Set up applications
  NS_LOG_INFO ("Installing Applications");
  std::ostringstream prefix;
  prefix << "/" << producerNode.Get(0)->GetId ();
  
  CcnxAppHelper consumerHelper ("ns3::CcnxConsumer");
  consumerHelper.SetPrefix (prefix.str ());
  consumerHelper.SetAttribute ("MeanRate", StringValue ("1Mbps"));
  ApplicationContainer consumers = consumerHelper.Install (consumerNode);
  
  // consumers.Start (Seconds (0.0));
  // consumers.Stop (finishTime);
    
  CcnxAppHelper producerHelper ("ns3::CcnxProducer");
  producerHelper.SetPrefix (prefix.str ());
  producerHelper.SetAttribute ("PayloadSize", StringValue("1024"));
  ApplicationContainer producers = producerHelper.Install (producerNode);

  Simulator::Stop (Seconds (10.0));
  Simulator::Run ();
  Simulator::Destroy ();
  return 0;
}
