/// <summary>
    /// Runs the code example.
    /// </summary>
    /// <param name="user">The AdWords user.</param>
    /// <param name="campaignId">Id of the campaign to be updated.</param>
    public void Run(AdWordsUser user, long campaignId) {
      // Get the CampaignService.
      CampaignService campaignService =
          (CampaignService)user.GetService(AdWordsService.v201506.CampaignService);

      // Create the campaign.
      Campaign campaign = new Campaign();
      campaign.id = campaignId;
      campaign.status = CampaignStatus.PAUSED;

      // Create the operation.
      CampaignOperation operation = new CampaignOperation();
      operation.@operator = Operator.SET;
      operation.operand = campaign;

      try {
        // Update the campaign.
        CampaignReturnValue retVal = campaignService.mutate((new CampaignOperation[] {operation}));

        // Display the results.
        if (retVal != null && retVal.value != null && retVal.value.Length > 0) {
          Campaign updatedCampaign = retVal.value[0];
          Console.WriteLine("Campaign with name = '{0}' and id = '{1}' was updated.",
              updatedCampaign.name, updatedCampaign.id);
        } else {
          Console.WriteLine("No campaigns were updated.");
        }
      } catch (Exception ex) {
        throw new System.ApplicationException("Failed to update campaign.", ex);
      }
    }
    /// <summary>
    /// Runs the code example.
    /// </summary>
    /// <param name="user">The AdWords user.</param>
    /// <param name="campaignId">Id of the campaign to be removed.</param>
    public void Run(AdWordsUser user, long campaignId) {
      // Get the CampaignService.
      CampaignService campaignService = (CampaignService) user.GetService(
          AdWordsService.v201506.CampaignService);

      // Create campaign with REMOVED status.
      Campaign campaign = new Campaign();
      campaign.id = campaignId;
      campaign.status = CampaignStatus.REMOVED;

      // Create the operation.
      CampaignOperation operation = new CampaignOperation();
      operation.operand = campaign;
      operation.@operator = Operator.SET;

      try {
        // Remove the campaign.
        CampaignReturnValue retVal = campaignService.mutate(new CampaignOperation[] {operation});

        // Display the results.
        if (retVal != null && retVal.value != null && retVal.value.Length > 0) {
          Campaign removedCampaign = retVal.value[0];
          Console.WriteLine("Campaign with id = \"{0}\" was renamed to \"{1}\" and removed.",
              removedCampaign.id, removedCampaign.name);
        } else {
          Console.WriteLine("No campaigns were removed.");
        }
      } catch (Exception e) {
        throw new System.ApplicationException("Failed to remove campaign.", e);
      }
    }
    /// <summary>
    /// Creates the shopping campaign.
    /// </summary>
    /// <param name="budgetId">The budget id.</param>
    /// <param name="merchantId">The Merchant Center id.</param>
    /// <param name="campaignService">The CampaignService instance.</param>
    /// <returns>The Shopping campaign.</returns>
    private static Campaign CreateCampaign(long budgetId, long merchantId,
        CampaignService campaignService) {
      // Create campaign.
      Campaign campaign = new Campaign();
      campaign.name = "Shopping campaign #" + ExampleUtilities.GetRandomString();
      // The advertisingChannelType is what makes this a Shopping campaign.
      campaign.advertisingChannelType = AdvertisingChannelType.SHOPPING;

      // Set shared budget (required).
      campaign.budget = new Budget();
      campaign.budget.budgetId = budgetId;

      // Set bidding strategy (required).
      BiddingStrategyConfiguration biddingStrategyConfiguration =
          new BiddingStrategyConfiguration();
      biddingStrategyConfiguration.biddingStrategyType = BiddingStrategyType.MANUAL_CPC;

      campaign.biddingStrategyConfiguration = biddingStrategyConfiguration;

      // All Shopping campaigns need a ShoppingSetting.
      ShoppingSetting shoppingSetting = new ShoppingSetting();
      shoppingSetting.salesCountry = "US";
      shoppingSetting.campaignPriority = 0;
      shoppingSetting.merchantId = merchantId;

      // Set to "true" to enable Local Inventory Ads in your campaign.
      shoppingSetting.enableLocal = true;
      campaign.settings = new Setting[] { shoppingSetting };

      // Create operation.
      CampaignOperation campaignOperation = new CampaignOperation();
      campaignOperation.operand = campaign;
      campaignOperation.@operator = Operator.ADD;

      // Make the mutate request.
      CampaignReturnValue retval = campaignService.mutate(
          new CampaignOperation[] { campaignOperation });

      return retval.value[0];
    }
    /// <summary>
    /// Runs the code example.
    /// </summary>
    /// <param name="user">The AdWords user.</param>
    public void Run(AdWordsUser user) {
      // Get the CampaignService.
      BudgetService budgetService =
          (BudgetService) user.GetService(AdWordsService.v201506.BudgetService);

      // Get the CampaignService.
      CampaignService campaignService =
          (CampaignService) user.GetService(AdWordsService.v201506.CampaignService);

      // Create the campaign budget.
      Budget budget = new Budget();
      budget.name = "Interplanetary Cruise Budget #" + ExampleUtilities.GetRandomString();
      budget.period = BudgetBudgetPeriod.DAILY;
      budget.deliveryMethod = BudgetBudgetDeliveryMethod.STANDARD;
      budget.amount = new Money();
      budget.amount.microAmount = 500000;

      BudgetOperation budgetOperation = new BudgetOperation();
      budgetOperation.@operator = Operator.ADD;
      budgetOperation.operand = budget;

      try {
        BudgetReturnValue budgetRetval = budgetService.mutate(new BudgetOperation[] {budgetOperation});
        budget = budgetRetval.value[0];
      } catch (Exception ex) {
        throw new System.ApplicationException("Failed to add shared budget.", ex);
      }

      List<CampaignOperation> operations = new List<CampaignOperation>();

      for (int i = 0; i < NUM_ITEMS; i++) {
        // Create the campaign.
        Campaign campaign = new Campaign();
        campaign.name = "Interplanetary Cruise #" + ExampleUtilities.GetRandomString();
        campaign.status = CampaignStatus.PAUSED;
        campaign.advertisingChannelType = AdvertisingChannelType.SEARCH;

        BiddingStrategyConfiguration biddingConfig = new BiddingStrategyConfiguration();
        biddingConfig.biddingStrategyType = BiddingStrategyType.MANUAL_CPM;

        // Optional: also provide matching bidding scheme.
        biddingConfig.biddingScheme = new ManualCpmBiddingScheme();

        campaign.biddingStrategyConfiguration = biddingConfig;

        // Set the campaign budget.
        campaign.budget = new Budget();
        campaign.budget.budgetId = budget.budgetId;

        // Set targetContentNetwork true. Other network targeting is not available
        // for Ad Exchange Buyers.
        campaign.networkSetting = new NetworkSetting();
        campaign.networkSetting.targetGoogleSearch = false;
        campaign.networkSetting.targetSearchNetwork = false;
        campaign.networkSetting.targetContentNetwork = true;
        campaign.networkSetting.targetPartnerSearchNetwork = false;

        // Enable campaign for Real-time bidding.
        RealTimeBiddingSetting rtbSetting = new RealTimeBiddingSetting();
        rtbSetting.optIn = true;

        campaign.settings = new Setting[] {rtbSetting};

        // Optional: Set the start date.
        campaign.startDate = DateTime.Now.AddDays(1).ToString("yyyyMMdd");

        // Optional: Set the end date.
        campaign.endDate = DateTime.Now.AddYears(1).ToString("yyyyMMdd");

        // Optional: Set the campaign ad serving optimization status.
        campaign.adServingOptimizationStatus = AdServingOptimizationStatus.ROTATE;

        // Optional: Set the frequency cap.
        FrequencyCap frequencyCap = new FrequencyCap();
        frequencyCap.impressions = 5;
        frequencyCap.level = Level.ADGROUP;
        frequencyCap.timeUnit = TimeUnit.DAY;
        campaign.frequencyCap = frequencyCap;

        // Create the operation.
        CampaignOperation operation = new CampaignOperation();
        operation.@operator = Operator.ADD;
        operation.operand = campaign;

        operations.Add(operation);
      }

      try {
        // Add the campaign.
        CampaignReturnValue retVal = campaignService.mutate(operations.ToArray());

        // Display the results.
        if (retVal != null && retVal.value != null && retVal.value.Length > 0) {
          foreach (Campaign newCampaign in retVal.value) {
            Console.WriteLine("Campaign with name = '{0}' and id = '{1}' was added.",
                newCampaign.name, newCampaign.id);
          }
        } else {
          Console.WriteLine("No campaigns were added.");
        }
      } catch (Exception ex) {
        throw new System.ApplicationException("Failed to add campaigns.", ex);
      }
    }
    public void TestGetAllCampaignsMockAndCallServer() {
      ServiceSignature mockSignature = MockUtilities.RegisterMockService(user,
          AdWordsService.v201506.CampaignService, typeof(MockCampaignServiceEx));

      CampaignService campaignService = (CampaignService) user.GetService(mockSignature);
      Assert.That(campaignService is MockCampaignServiceEx);

      Campaign campaign = new Campaign();
      campaign.name = "Interplanetary Cruise #" + new TestUtils().GetTimeStamp();
      campaign.status = CampaignStatus.PAUSED;
      campaign.biddingStrategyConfiguration = new BiddingStrategyConfiguration();
      campaign.biddingStrategyConfiguration.biddingStrategyType = BiddingStrategyType.MANUAL_CPC;

      Budget budget = new Budget();
      budget.budgetId = budgetId;

      campaign.budget = budget;

      campaign.budget = budget;

      // Set the campaign network options to GoogleSearch and SearchNetwork
      // only. Set ContentNetwork, PartnerSearchNetwork and ContentContextual
      // to false.
      campaign.networkSetting = new NetworkSetting();
      campaign.networkSetting.targetGoogleSearch = true;
      campaign.networkSetting.targetSearchNetwork = true;
      campaign.networkSetting.targetContentNetwork = false;
      campaign.networkSetting.targetPartnerSearchNetwork = false;

      // Create operations.
      CampaignOperation operation = new CampaignOperation();
      operation.@operator = Operator.ADD;
      operation.operand = campaign;

      CampaignReturnValue retVal = null;

      Assert.DoesNotThrow(delegate() {
        retVal = campaignService.mutate((new CampaignOperation[] { operation }));
      });

      Assert.NotNull(retVal);
      Assert.NotNull(retVal.value);
      Assert.AreEqual(retVal.value.Length, 1);
      Assert.AreEqual(retVal.value[0].name, campaign.name);
      Assert.AreNotEqual(retVal.value[0].id, 0);
      Assert.True((campaignService as MockCampaignServiceEx).MutateCalled);
    }
    /// <summary>
    /// Creates the campaign with a shared bidding strategy.
    /// </summary>
    /// <param name="campaignService">The campaign service.</param>
    /// <param name="name">The campaign name.</param>
    /// <param name="biddingStrategyId">The bidding strategy id.</param>
    /// <param name="sharedBudgetId">The shared budget id.</param>
    /// <returns>The campaign object.</returns>
    private Campaign CreateCampaignWithBiddingStrategy(CampaignService campaignService, string name,
        long biddingStrategyId, long sharedBudgetId) {
      // Create campaign.
      Campaign campaign = new Campaign();
      campaign.name = name;
      campaign.advertisingChannelType = AdvertisingChannelType.SEARCH;

      // Set the budget.
      campaign.budget = new Budget();
      campaign.budget.budgetId = sharedBudgetId;

      // Set bidding strategy (required).
      BiddingStrategyConfiguration biddingStrategyConfiguration =
          new BiddingStrategyConfiguration();
      biddingStrategyConfiguration.biddingStrategyId = biddingStrategyId;

      campaign.biddingStrategyConfiguration = biddingStrategyConfiguration;

      // Set network targeting (recommended).
      NetworkSetting networkSetting = new NetworkSetting();
      networkSetting.targetGoogleSearch = true;
      networkSetting.targetSearchNetwork = true;
      networkSetting.targetContentNetwork = true;
      campaign.networkSetting = networkSetting;

      // Create operation.
      CampaignOperation operation = new CampaignOperation();
      operation.operand = campaign;
      operation.@operator = Operator.ADD;

      return campaignService.mutate(new CampaignOperation[] {operation}).value[0];
    }
    /// <summary>
    /// Creates a test campaign for running further tests.
    /// </summary>
    /// <param name="user">The AdWords user.</param>
    /// <param name="channelType">The advertising channel type for this
    /// campaign.</param>
    /// <param param name="strategyType">The bidding strategy to be used for
    /// this campaign.</param>
    /// <param name="isMobile">True, if this campaign is mobile-only, false
    /// otherwise.</param>
    /// <returns>The campaign id.</returns>
    public long CreateCampaign(AdWordsUser user, AdvertisingChannelType channelType,
        BiddingStrategyType strategyType, bool isMobile) {
      CampaignService campaignService =
          (CampaignService) user.GetService(AdWordsService.v201506.CampaignService);

      Campaign campaign = new Campaign() {
        name = string.Format("Campaign {0}", DateTime.Now.ToString("yyyy-M-d H:m:s.ffffff")),
        advertisingChannelType = channelType,
        status = CampaignStatus.PAUSED,
        biddingStrategyConfiguration = new BiddingStrategyConfiguration() {
          biddingStrategyType = strategyType
        },
        budget = new Budget() {
          budgetId = CreateBudget(user),
          period = BudgetBudgetPeriod.DAILY,
          amount = new Money() {
            microAmount = 100000000,
          },
          deliveryMethod = BudgetBudgetDeliveryMethod.STANDARD
        }
      };

      if (isMobile) {
        switch (campaign.advertisingChannelType) {
          case AdvertisingChannelType.SEARCH:
            campaign.advertisingChannelSubType = AdvertisingChannelSubType.SEARCH_MOBILE_APP;
            break;

          case AdvertisingChannelType.DISPLAY:
            campaign.advertisingChannelSubType = AdvertisingChannelSubType.DISPLAY_MOBILE_APP;
            break;
        }
      }

      List<Setting> settings = new List<Setting>();

      if (channelType == AdvertisingChannelType.SHOPPING) {
        // All Shopping campaigns need a ShoppingSetting.
        ShoppingSetting shoppingSetting = new ShoppingSetting() {
          salesCountry = "US",
          campaignPriority = 0,
          merchantId = (user.Config as AdWordsAppConfig).MerchantCenterId
        };
        settings.Add(shoppingSetting);
      }
      campaign.settings = settings.ToArray();

      CampaignOperation campaignOperation = new CampaignOperation() {
        @operator = Operator.ADD,
        operand = campaign
      };

      CampaignReturnValue retVal =
          campaignService.mutate(new CampaignOperation[] { campaignOperation });
      return retVal.value[0].id;
    }
    /// <summary>
    /// Creates a test campaign for running further tests.
    /// </summary>
    /// <param name="user">The AdWords user.</param>
    /// <param name="biddingStrategy">The bidding strategy to be used.</param>
    /// <returns>The campaign id.</returns>
    public long CreateCampaign(AdWordsUser user, AdvertisingChannelType channelType,
        BiddingStrategyType strategyType) {
      CampaignService campaignService =
          (CampaignService) user.GetService(AdWordsService.v201506.CampaignService);

      BiddingStrategyConfiguration biddingConfig = new BiddingStrategyConfiguration();
      biddingConfig.biddingStrategyType = strategyType;

      CampaignOperation campaignOperation = new CampaignOperation();
      campaignOperation.@operator = Operator.ADD;
      campaignOperation.operand = new Campaign();
      campaignOperation.operand.name =
          string.Format("Campaign {0}", DateTime.Now.ToString("yyyy-M-d H:m:s.ffffff"));
      campaignOperation.operand.advertisingChannelType = channelType;
      campaignOperation.operand.status = CampaignStatus.PAUSED;
      campaignOperation.operand.biddingStrategyConfiguration = biddingConfig;
      campaignOperation.operand.budget = new Budget();
      campaignOperation.operand.budget.budgetId = CreateBudget(user);
      campaignOperation.operand.budget.period = BudgetBudgetPeriod.DAILY;
      campaignOperation.operand.budget.amount = new Money();
      campaignOperation.operand.budget.amount.microAmount = 100000000;
      campaignOperation.operand.budget.deliveryMethod = BudgetBudgetDeliveryMethod.STANDARD;

      List<Setting> settings = new List<Setting>();

      if (channelType == AdvertisingChannelType.SHOPPING) {
        // All Shopping campaigns need a ShoppingSetting.
        ShoppingSetting shoppingSetting = new ShoppingSetting();
        shoppingSetting.salesCountry = "US";
        shoppingSetting.campaignPriority = 0;
        shoppingSetting.merchantId = (user.Config as AdWordsAppConfig).MerchantCenterId;

        settings.Add(shoppingSetting);
      }
      campaignOperation.operand.settings = settings.ToArray();

      CampaignReturnValue retVal =
          campaignService.mutate(new CampaignOperation[] {campaignOperation});
      return retVal.value[0].id;
    }