##################################
### Version using ADD twice, partial extension setting for the second ADD (only id and type)

operations = [
  # Budgets for campaigns
  {
    :xsi_type=>"BudgetOperation",
    :operator=>"ADD",
    :operand=>
    {
      :budget_id=> -1,
      :name=>"Test S9 Campaign1 Budget",
      :amount=>{:micro_amount=>100000000}
    }
  },
  {
    :xsi_type=>"BudgetOperation",
    :operator=>"ADD",
    :operand=> {
      :budget_id=> -2,
      :name=>"Test S9 Campaign2 Budget",
      :amount=>{:micro_amount=>100000000}
    }
  },
  # Campaigns, ids -3 and -4
  {
    :xsi_type=>"CampaignOperation",
    :operator=>"ADD",
    :operand=> {
      :id=> -3,
      :budget=>{:budget_id=>-1},
      :name=>"Test S9 Campaign1",
      :status=>"ENABLED",
      :advertising_channel_type=>'SEARCH',
      :bidding_strategy_configuration=>{:bidding_strategy_type=>'MANUAL_CPC'}
    }
  },
  {
    :xsi_type=>"CampaignOperation",
    :operator=>"ADD",
    :operand=> {
      :id=> -4,
      :budget=>{:budget_id=>-2},
      :name=>"Test S9 Campaign2",
      :status=>"ENABLED",
      :advertising_channel_type=>'SEARCH',
      :bidding_strategy_configuration=>{:bidding_strategy_type=>'MANUAL_CPC'}
    }
  },
  ###############
  # Sitelinks
  ##############
  {
    :xsi_type=>"CampaignExtensionSettingOperation",
    :operator=>"ADD",
    :operand=> {
      :campaign_id=>-3,
      :extension_type=>"SITELINK",
      :extension_setting=> {
        :xsi_type=>"ExtensionSetting",
        :extensions=> [
          {
            :feed_item_id=>-5,
            :xsi_type=>"SitelinkFeedItem",
            :sitelink_text=>"Store Hours",
            :sitelink_final_urls=>{:urls=>["http://www.example.com/"]}
          }
        ]
      }
    }
  },
  {
    :xsi_type=>"CampaignExtensionSettingOperation",
    :operator=>"ADD",
    :operand=> {
      :campaign_id=>-4,
      :extension_type=>"SITELINK",
      :extension_setting=> {
        :xsi_type=>"ExtensionSetting",
        :extensions=> [
          {
            :feed_item_id=>-5,
            :xsi_type=>"SitelinkFeedItem"
          }
        ]
      }
    }
  }
]


#### Sitelinks results ("success", same feed item ids):
{:result=>
  {:campaign_extension_setting=>
    {:extension_type=>"SITELINK",
     :extension_setting=>
      {:extensions=>
        {:feed_id=>"20505208",
         :feed_item_id=>"11333519111",
         :status=>"ENABLED",
         :feed_type=>"SITELINK",
         :extension_feed_item_type=>"SitelinkFeedItem",
         :sitelink_text=>"Store Hours",
         :sitelink_final_urls=>{:urls=>"http://www.example.com/"}},
       :platform_restrictions=>"NONE"}}},
 :index=>"4"}
{:result=>
  {:campaign_extension_setting=>
    {:extension_type=>"SITELINK",
     :extension_setting=>
      {:extensions=>
        {:feed_id=>"20505208",
         :feed_item_id=>"11333519111",
         :status=>"ENABLED",
         :feed_type=>"SITELINK",
         :extension_feed_item_type=>"SitelinkFeedItem",
         :sitelink_text=>"Store Hours",
         :sitelink_final_urls=>{:urls=>"http://www.example.com/"}},
       :platform_restrictions=>"NONE"}}},
 :index=>"5"}




 ##########################
 ### Version using ADD then SET, partial extension setting for SET (only id and type)
### This is equivalent to my second attempt

operations = [
  # Budgets for campaigns
  {
    :xsi_type=>"BudgetOperation",
    :operator=>"ADD",
    :operand=>
    {
      :budget_id=> -1,
      :name=>"Test S6 Campaign1 Budget",
      :amount=>{:micro_amount=>100000000}
    }
  },
  {
    :xsi_type=>"BudgetOperation",
    :operator=>"ADD",
    :operand=> {
      :budget_id=> -2,
      :name=>"Test S6 Campaign2 Budget",
      :amount=>{:micro_amount=>100000000}
    }
  },
  # Campaigns, ids -3 and -4
  {
    :xsi_type=>"CampaignOperation",
    :operator=>"ADD",
    :operand=> {
      :id=> -3,
      :budget=>{:budget_id=>-1},
      :name=>"Test S6 Campaign1",
      :status=>"ENABLED",
      :advertising_channel_type=>'SEARCH',
      :bidding_strategy_configuration=>{:bidding_strategy_type=>'MANUAL_CPC'}
    }
  },
  {
    :xsi_type=>"CampaignOperation",
    :operator=>"ADD",
    :operand=> {
      :id=> -4,
      :budget=>{:budget_id=>-2},
      :name=>"Test S6 Campaign2",
      :status=>"ENABLED",
      :advertising_channel_type=>'SEARCH',
      :bidding_strategy_configuration=>{:bidding_strategy_type=>'MANUAL_CPC'}
    }
  },
  ###############
  # Sitelinks
  ##############
  {
    :xsi_type=>"CampaignExtensionSettingOperation",
    :operator=>"ADD",
    :operand=> {
      :campaign_id=>-3,
      :extension_type=>"SITELINK",
      :extension_setting=> {
        :xsi_type=>"ExtensionSetting",
        :extensions=> [
          {
            :feed_item_id=>-5,
            :xsi_type=>"SitelinkFeedItem",
            :sitelink_text=>"Store Hours",
            :sitelink_final_urls=>{:urls=>["http://www.example.com/"]}
          }
        ]
      }
    }
  },
  {
    :xsi_type=>"CampaignExtensionSettingOperation",
    :operator=>"SET",
    :operand=> {
      :campaign_id=>-4,
      :extension_type=>"SITELINK",
      :extension_setting=> {
        :xsi_type=>"ExtensionSetting",
        :extensions=> [
          {
            :feed_item_id=>-5,
            :xsi_type=>"SitelinkFeedItem"
          }
        ]
      }
    }
  }
]


#### Sitelinks results ("success", same feed item ids):
{:result=>
  {:campaign_extension_setting=>
    {:extension_type=>"SITELINK",
     :extension_setting=>
      {:extensions=>
        {:feed_id=>"20505208",
         :feed_item_id=>"11330827968",
         :status=>"ENABLED",
         :feed_type=>"SITELINK",
         :extension_feed_item_type=>"SitelinkFeedItem",
         :sitelink_text=>"Store Hours",
         :sitelink_final_urls=>{:urls=>"http://www.example.com/"}},
       :platform_restrictions=>"NONE"}}},
 :index=>"4"}
{:result=>
  {:campaign_extension_setting=>
    {:extension_type=>"SITELINK",
     :extension_setting=>
      {:extensions=>
        {:feed_id=>"20505208",
         :feed_item_id=>"11330827968",
         :status=>"ENABLED",
         :feed_type=>"SITELINK",
         :extension_feed_item_type=>"SitelinkFeedItem",
         :sitelink_text=>"Store Hours",
         :sitelink_final_urls=>{:urls=>"http://www.example.com/"}},
       :platform_restrictions=>"NONE"}}},
 :index=>"5"}


 ###########################################
 ### Version using ADD twice, full extension setting in both
### This is equivalent to my first attempt

operations = [
  # Budgets for campaigns
  {
    :xsi_type=>"BudgetOperation",
    :operator=>"ADD",
    :operand=>
    {
      :budget_id=> -1,
      :name=>"Test S8 Campaign1 Budget",
      :amount=>{:micro_amount=>100000000}
    }
  },
  {
    :xsi_type=>"BudgetOperation",
    :operator=>"ADD",
    :operand=> {
      :budget_id=> -2,
      :name=>"Test S8 Campaign2 Budget",
      :amount=>{:micro_amount=>100000000}
    }
  },
  # Campaigns, ids -3 and -4
  {
    :xsi_type=>"CampaignOperation",
    :operator=>"ADD",
    :operand=> {
      :id=> -3,
      :budget=>{:budget_id=>-1},
      :name=>"Test S8 Campaign1",
      :status=>"ENABLED",
      :advertising_channel_type=>'SEARCH',
      :bidding_strategy_configuration=>{:bidding_strategy_type=>'MANUAL_CPC'}
    }
  },
  {
    :xsi_type=>"CampaignOperation",
    :operator=>"ADD",
    :operand=> {
      :id=> -4,
      :budget=>{:budget_id=>-2},
      :name=>"Test S8 Campaign2",
      :status=>"ENABLED",
      :advertising_channel_type=>'SEARCH',
      :bidding_strategy_configuration=>{:bidding_strategy_type=>'MANUAL_CPC'}
    }
  },
  ###############
  # Sitelinks
  ##############
  {
    :xsi_type=>"CampaignExtensionSettingOperation",
    :operator=>"ADD",
    :operand=> {
      :campaign_id=>-3,
      :extension_type=>"SITELINK",
      :extension_setting=> {
        :xsi_type=>"ExtensionSetting",
        :extensions=> [
          {
            :feed_item_id=>-5,
            :xsi_type=>"SitelinkFeedItem",
            :sitelink_text=>"Store Hours",
            :sitelink_final_urls=>{:urls=>["http://www.example.com/"]}
          }
        ]
      }
    }
  },
  {
    :xsi_type=>"CampaignExtensionSettingOperation",
    :operator=>"ADD",
    :operand=> {
      :campaign_id=>-4,
      :extension_type=>"SITELINK",
      :extension_setting=> {
        :xsi_type=>"ExtensionSetting",
        :extensions=> [
          {
            :feed_item_id=>-5,
            :xsi_type=>"SitelinkFeedItem",
            :sitelink_text=>"Store Hours",
            :sitelink_final_urls=>{:urls=>["http://www.example.com/"]}
          }
        ]
      }
    }
  }
]


### Sitelinks results (error, duplicate element):
{:result=>
  {:campaign_extension_setting=>
    {:extension_type=>"SITELINK",
     :extension_setting=>
      {:extensions=>
        {:feed_id=>"20505208",
         :feed_item_id=>"11330947227",
         :status=>"ENABLED",
         :feed_type=>"SITELINK",
         :extension_feed_item_type=>"SitelinkFeedItem",
         :sitelink_text=>"Store Hours",
         :sitelink_final_urls=>{:urls=>"http://www.example.com/"}},
       :platform_restrictions=>"NONE"}}},
 :index=>"4"}
{:error_list=>
  {:errors=>
    {:field_path=>
      "operations[5].operand.extensionSetting.extensions[0].feedItemId",
     :trigger=>"TempFeedItemId{id=5}",
     :error_string=>"DistinctError.DUPLICATE_ELEMENT",
     :api_error_type=>"DistinctError",
     :reason=>"DUPLICATE_ELEMENT"}},
 :index=>"5"}




 ###################################
 ### Version using ADD then SET, full extension setting in both

operations = [
  # Budgets for campaigns
  {
    :xsi_type=>"BudgetOperation",
    :operator=>"ADD",
    :operand=>
    {
      :budget_id=> -1,
      :name=>"Test S7 Campaign1 Budget",
      :amount=>{:micro_amount=>100000000}
    }
  },
  {
    :xsi_type=>"BudgetOperation",
    :operator=>"ADD",
    :operand=> {
      :budget_id=> -2,
      :name=>"Test S7 Campaign2 Budget",
      :amount=>{:micro_amount=>100000000}
    }
  },
  # Campaigns, ids -3 and -4
  {
    :xsi_type=>"CampaignOperation",
    :operator=>"ADD",
    :operand=> {
      :id=> -3,
      :budget=>{:budget_id=>-1},
      :name=>"Test S7 Campaign1",
      :status=>"ENABLED",
      :advertising_channel_type=>'SEARCH',
      :bidding_strategy_configuration=>{:bidding_strategy_type=>'MANUAL_CPC'}
    }
  },
  {
    :xsi_type=>"CampaignOperation",
    :operator=>"ADD",
    :operand=> {
      :id=> -4,
      :budget=>{:budget_id=>-2},
      :name=>"Test S7 Campaign2",
      :status=>"ENABLED",
      :advertising_channel_type=>'SEARCH',
      :bidding_strategy_configuration=>{:bidding_strategy_type=>'MANUAL_CPC'}
    }
  },
  ###############
  # Sitelinks
  ##############
  {
    :xsi_type=>"CampaignExtensionSettingOperation",
    :operator=>"ADD",
    :operand=> {
      :campaign_id=>-3,
      :extension_type=>"SITELINK",
      :extension_setting=> {
        :xsi_type=>"ExtensionSetting",
        :extensions=> [
          {
            :feed_item_id=>-5,
            :xsi_type=>"SitelinkFeedItem",
            :sitelink_text=>"Store Hours",
            :sitelink_final_urls=>{:urls=>["http://www.example.com/"]}
          }
        ]
      }
    }
  },
  {
    :xsi_type=>"CampaignExtensionSettingOperation",
    :operator=>"SET",
    :operand=> {
      :campaign_id=>-4,
      :extension_type=>"SITELINK",
      :extension_setting=> {
        :xsi_type=>"ExtensionSetting",
        :extensions=> [
          {
            :feed_item_id=>-5,
            :xsi_type=>"SitelinkFeedItem",
            :sitelink_text=>"Store Hours",
            :sitelink_final_urls=>{:urls=>["http://www.example.com/"]}
          }
        ]
      }
    }
  }
]


### Sitelinks results (error, duplicate element):
{:result=>
  {:campaign_extension_setting=>
    {:extension_type=>"SITELINK",
     :extension_setting=>
      {:extensions=>
        {:feed_id=>"20505208",
         :feed_item_id=>"11333908102",
         :status=>"ENABLED",
         :feed_type=>"SITELINK",
         :extension_feed_item_type=>"SitelinkFeedItem",
         :sitelink_text=>"Store Hours",
         :sitelink_final_urls=>{:urls=>"http://www.example.com/"}},
       :platform_restrictions=>"NONE"}}},
 :index=>"4"}
{:error_list=>
  {:errors=>
    {:field_path=>
      "operations[5].operand.extensionSetting.extensions[0].feedItemId",
     :trigger=>"TempFeedItemId{id=5}",
     :error_string=>"DistinctError.DUPLICATE_ELEMENT",
     :api_error_type=>"DistinctError",
     :reason=>"DUPLICATE_ELEMENT"}},
 :index=>"5"}
