// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.22.0
// 	protoc        v3.12.2
// source: google/ads/googleads/v3/enums/app_campaign_bidding_strategy_goal_type.proto

package enums

import (
	reflect "reflect"
	sync "sync"

	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4

// Goal type of App campaign BiddingStrategy.
type AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType int32

const (
	// Not specified.
	AppCampaignBiddingStrategyGoalTypeEnum_UNSPECIFIED AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType = 0
	// Used for return value only. Represents value unknown in this version.
	AppCampaignBiddingStrategyGoalTypeEnum_UNKNOWN AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType = 1
	// Aim to maximize the number of app installs. The cpa bid is the
	// target cost per install.
	AppCampaignBiddingStrategyGoalTypeEnum_OPTIMIZE_INSTALLS_TARGET_INSTALL_COST AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType = 2
	// Aim to maximize the long term number of selected in-app conversions from
	// app installs. The cpa bid is the target cost per install.
	AppCampaignBiddingStrategyGoalTypeEnum_OPTIMIZE_IN_APP_CONVERSIONS_TARGET_INSTALL_COST AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType = 3
	// Aim to maximize the long term number of selected in-app conversions from
	// app installs. The cpa bid is the target cost per in-app conversion. Note
	// that the actual cpa may seem higher than the target cpa at first, since
	// the long term conversions haven’t happened yet.
	AppCampaignBiddingStrategyGoalTypeEnum_OPTIMIZE_IN_APP_CONVERSIONS_TARGET_CONVERSION_COST AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType = 4
	// Aim to maximize all conversions' value, i.e. install + selected in-app
	// conversions while achieving or exceeding target return on advertising
	// spend.
	AppCampaignBiddingStrategyGoalTypeEnum_OPTIMIZE_RETURN_ON_ADVERTISING_SPEND AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType = 5
)

// Enum value maps for AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType.
var (
	AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "OPTIMIZE_INSTALLS_TARGET_INSTALL_COST",
		3: "OPTIMIZE_IN_APP_CONVERSIONS_TARGET_INSTALL_COST",
		4: "OPTIMIZE_IN_APP_CONVERSIONS_TARGET_CONVERSION_COST",
		5: "OPTIMIZE_RETURN_ON_ADVERTISING_SPEND",
	}
	AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType_value = map[string]int32{
		"UNSPECIFIED":                           0,
		"UNKNOWN":                               1,
		"OPTIMIZE_INSTALLS_TARGET_INSTALL_COST": 2,
		"OPTIMIZE_IN_APP_CONVERSIONS_TARGET_INSTALL_COST":    3,
		"OPTIMIZE_IN_APP_CONVERSIONS_TARGET_CONVERSION_COST": 4,
		"OPTIMIZE_RETURN_ON_ADVERTISING_SPEND":               5,
	}
)

func (x AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType) Enum() *AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType {
	p := new(AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType)
	*p = x
	return p
}

func (x AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_enumTypes[0].Descriptor()
}

func (AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_enumTypes[0]
}

func (x AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType.Descriptor instead.
func (AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType) EnumDescriptor() ([]byte, []int) {
	return file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_rawDescGZIP(), []int{0, 0}
}

// Container for enum describing goal towards which the bidding strategy of an
// app campaign should optimize for.
type AppCampaignBiddingStrategyGoalTypeEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *AppCampaignBiddingStrategyGoalTypeEnum) Reset() {
	*x = AppCampaignBiddingStrategyGoalTypeEnum{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AppCampaignBiddingStrategyGoalTypeEnum) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AppCampaignBiddingStrategyGoalTypeEnum) ProtoMessage() {}

func (x *AppCampaignBiddingStrategyGoalTypeEnum) ProtoReflect() protoreflect.Message {
	mi := &file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use AppCampaignBiddingStrategyGoalTypeEnum.ProtoReflect.Descriptor instead.
func (*AppCampaignBiddingStrategyGoalTypeEnum) Descriptor() ([]byte, []int) {
	return file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_rawDescGZIP(), []int{0}
}

var File_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_rawDesc = []byte{
	0x0a, 0x4b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x33, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2f,
	0x61, 0x70, 0x70, 0x5f, 0x63, 0x61, 0x6d, 0x70, 0x61, 0x69, 0x67, 0x6e, 0x5f, 0x62, 0x69, 0x64,
	0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x5f, 0x67, 0x6f,
	0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x61, 0x64, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x1a, 0x1c, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74,
	0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xaf, 0x02, 0x0a, 0x26, 0x41,
	0x70, 0x70, 0x43, 0x61, 0x6d, 0x70, 0x61, 0x69, 0x67, 0x6e, 0x42, 0x69, 0x64, 0x64, 0x69, 0x6e,
	0x67, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x47, 0x6f, 0x61, 0x6c, 0x54, 0x79, 0x70,
	0x65, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0x84, 0x02, 0x0a, 0x22, 0x41, 0x70, 0x70, 0x43, 0x61, 0x6d,
	0x70, 0x61, 0x69, 0x67, 0x6e, 0x42, 0x69, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x72, 0x61,
	0x74, 0x65, 0x67, 0x79, 0x47, 0x6f, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b,
	0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a,
	0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x12, 0x29, 0x0a, 0x25, 0x4f, 0x50,
	0x54, 0x49, 0x4d, 0x49, 0x5a, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x53, 0x5f,
	0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x5f, 0x43,
	0x4f, 0x53, 0x54, 0x10, 0x02, 0x12, 0x33, 0x0a, 0x2f, 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x5a,
	0x45, 0x5f, 0x49, 0x4e, 0x5f, 0x41, 0x50, 0x50, 0x5f, 0x43, 0x4f, 0x4e, 0x56, 0x45, 0x52, 0x53,
	0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x49, 0x4e, 0x53, 0x54,
	0x41, 0x4c, 0x4c, 0x5f, 0x43, 0x4f, 0x53, 0x54, 0x10, 0x03, 0x12, 0x36, 0x0a, 0x32, 0x4f, 0x50,
	0x54, 0x49, 0x4d, 0x49, 0x5a, 0x45, 0x5f, 0x49, 0x4e, 0x5f, 0x41, 0x50, 0x50, 0x5f, 0x43, 0x4f,
	0x4e, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54,
	0x5f, 0x43, 0x4f, 0x4e, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x53, 0x54,
	0x10, 0x04, 0x12, 0x28, 0x0a, 0x24, 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x5a, 0x45, 0x5f, 0x52,
	0x45, 0x54, 0x55, 0x52, 0x4e, 0x5f, 0x4f, 0x4e, 0x5f, 0x41, 0x44, 0x56, 0x45, 0x52, 0x54, 0x49,
	0x53, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x50, 0x45, 0x4e, 0x44, 0x10, 0x05, 0x42, 0xfc, 0x01, 0x0a,
	0x21, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x65, 0x6e, 0x75,
	0x6d, 0x73, 0x42, 0x27, 0x41, 0x70, 0x70, 0x43, 0x61, 0x6d, 0x70, 0x61, 0x69, 0x67, 0x6e, 0x42,
	0x69, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x47, 0x6f,
	0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x42, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67,
	0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x61, 0x70, 0x69, 0x73, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61,
	0x64, 0x73, 0x2f, 0x76, 0x33, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x3b, 0x65, 0x6e, 0x75, 0x6d,
	0x73, 0xa2, 0x02, 0x03, 0x47, 0x41, 0x41, 0xaa, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x2e, 0x41, 0x64, 0x73, 0x2e, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x41, 0x64, 0x73, 0x2e, 0x56,
	0x33, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0xca, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x5c, 0x41, 0x64, 0x73, 0x5c, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x41, 0x64, 0x73, 0x5c, 0x56,
	0x33, 0x5c, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0xea, 0x02, 0x21, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x3a, 0x3a, 0x41, 0x64, 0x73, 0x3a, 0x3a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x41, 0x64, 0x73,
	0x3a, 0x3a, 0x56, 0x33, 0x3a, 0x3a, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x33,
}

var (
	file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_rawDescData = file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_rawDesc
)

func file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_rawDescData)
	})
	return file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_rawDescData
}

var file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_goTypes = []interface{}{
	(AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType)(0), // 0: google.ads.googleads.v3.enums.AppCampaignBiddingStrategyGoalTypeEnum.AppCampaignBiddingStrategyGoalType
	(*AppCampaignBiddingStrategyGoalTypeEnum)(nil),                                 // 1: google.ads.googleads.v3.enums.AppCampaignBiddingStrategyGoalTypeEnum
}
var file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_depIdxs = []int32{
	0, // [0:0] is the sub-list for method output_type
	0, // [0:0] is the sub-list for method input_type
	0, // [0:0] is the sub-list for extension type_name
	0, // [0:0] is the sub-list for extension extendee
	0, // [0:0] is the sub-list for field type_name
}

func init() { file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_init() }
func file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_init() {
	if File_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AppCampaignBiddingStrategyGoalTypeEnum); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto = out.File
	file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_rawDesc = nil
	file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_goTypes = nil
	file_google_ads_googleads_v3_enums_app_campaign_bidding_strategy_goal_type_proto_depIdxs = nil
}
