package awslogs

import (
	_jsii_ "github.com/aws/jsii-runtime-go/runtime"

	"github.com/aws/aws-cdk-go/awscdk/v2/awscloudwatch"
	"github.com/aws/aws-cdk-go/awscdk/v2/awsiam"
	"github.com/aws/aws-cdk-go/awscdk/v2/awslogs/internal"
)

type ILogGroup interface {
	awsiam.IResourceWithPolicy
	// Create a new Metric Filter on this Log Group.
	AddMetricFilter(id *string, props *MetricFilterOptions) MetricFilter
	// Create a new Log Stream for this Log Group.
	AddStream(id *string, props *StreamOptions) LogStream
	// Create a new Subscription Filter on this Log Group.
	AddSubscriptionFilter(id *string, props *SubscriptionFilterOptions) SubscriptionFilter
	// Create a new Transformer on this Log Group.
	AddTransformer(id *string, props *TransformerOptions) Transformer
	// Extract a metric from structured log events in the LogGroup.
	//
	// Creates a MetricFilter on this LogGroup that will extract the value
	// of the indicated JSON field in all records where it occurs.
	//
	// The metric will be available in CloudWatch Metrics under the
	// indicated namespace and name.
	//
	// Returns: A Metric object representing the extracted metric.
	ExtractMetric(jsonField *string, metricNamespace *string, metricName *string) awscloudwatch.Metric
	// Give the indicated permissions on this log group and all streams.
	Grant(grantee awsiam.IGrantable, actions ...*string) awsiam.Grant
	// Give permissions to read from this log group and streams.
	GrantRead(grantee awsiam.IGrantable) awsiam.Grant
	// Give permissions to write to create and write to streams in this log group.
	GrantWrite(grantee awsiam.IGrantable) awsiam.Grant
	// Public method to get the physical name of this log group.
	LogGroupPhysicalName() *string
	// Return the given named metric for this Log Group.
	Metric(metricName *string, props *awscloudwatch.MetricOptions) awscloudwatch.Metric
	// The volume of log events in uncompressed bytes uploaded to CloudWatch Logs.
	//
	// When used with the LogGroupName dimension, this is the volume of log events
	// in uncompressed bytes uploaded to the log group.
	MetricIncomingBytes(props *awscloudwatch.MetricOptions) awscloudwatch.Metric
	// The number of log events uploaded to CloudWatch Logs.
	//
	// When used with the LogGroupName dimension, this is the number of
	// log events uploaded to the log group.
	MetricIncomingLogEvents(props *awscloudwatch.MetricOptions) awscloudwatch.Metric
	// The ARN of this log group, with ':*' appended.
	LogGroupArn() *string
	// The name of this log group.
	LogGroupName() *string
}

// The jsii proxy for ILogGroup
type jsiiProxy_ILogGroup struct {
	internal.Type__awsiamIResourceWithPolicy
}

func (i *jsiiProxy_ILogGroup) AddMetricFilter(id *string, props *MetricFilterOptions) MetricFilter {
	if err := i.validateAddMetricFilterParameters(id, props); err != nil {
		panic(err)
	}
	var returns MetricFilter

	_jsii_.Invoke(
		i,
		"addMetricFilter",
		[]interface{}{id, props},
		&returns,
	)

	return returns
}

func (i *jsiiProxy_ILogGroup) AddStream(id *string, props *StreamOptions) LogStream {
	if err := i.validateAddStreamParameters(id, props); err != nil {
		panic(err)
	}
	var returns LogStream

	_jsii_.Invoke(
		i,
		"addStream",
		[]interface{}{id, props},
		&returns,
	)

	return returns
}

func (i *jsiiProxy_ILogGroup) AddSubscriptionFilter(id *string, props *SubscriptionFilterOptions) SubscriptionFilter {
	if err := i.validateAddSubscriptionFilterParameters(id, props); err != nil {
		panic(err)
	}
	var returns SubscriptionFilter

	_jsii_.Invoke(
		i,
		"addSubscriptionFilter",
		[]interface{}{id, props},
		&returns,
	)

	return returns
}

func (i *jsiiProxy_ILogGroup) AddTransformer(id *string, props *TransformerOptions) Transformer {
	if err := i.validateAddTransformerParameters(id, props); err != nil {
		panic(err)
	}
	var returns Transformer

	_jsii_.Invoke(
		i,
		"addTransformer",
		[]interface{}{id, props},
		&returns,
	)

	return returns
}

func (i *jsiiProxy_ILogGroup) ExtractMetric(jsonField *string, metricNamespace *string, metricName *string) awscloudwatch.Metric {
	if err := i.validateExtractMetricParameters(jsonField, metricNamespace, metricName); err != nil {
		panic(err)
	}
	var returns awscloudwatch.Metric

	_jsii_.Invoke(
		i,
		"extractMetric",
		[]interface{}{jsonField, metricNamespace, metricName},
		&returns,
	)

	return returns
}

func (i *jsiiProxy_ILogGroup) Grant(grantee awsiam.IGrantable, actions ...*string) awsiam.Grant {
	if err := i.validateGrantParameters(grantee); err != nil {
		panic(err)
	}
	args := []interface{}{grantee}
	for _, a := range actions {
		args = append(args, a)
	}

	var returns awsiam.Grant

	_jsii_.Invoke(
		i,
		"grant",
		args,
		&returns,
	)

	return returns
}

func (i *jsiiProxy_ILogGroup) GrantRead(grantee awsiam.IGrantable) awsiam.Grant {
	if err := i.validateGrantReadParameters(grantee); err != nil {
		panic(err)
	}
	var returns awsiam.Grant

	_jsii_.Invoke(
		i,
		"grantRead",
		[]interface{}{grantee},
		&returns,
	)

	return returns
}

func (i *jsiiProxy_ILogGroup) GrantWrite(grantee awsiam.IGrantable) awsiam.Grant {
	if err := i.validateGrantWriteParameters(grantee); err != nil {
		panic(err)
	}
	var returns awsiam.Grant

	_jsii_.Invoke(
		i,
		"grantWrite",
		[]interface{}{grantee},
		&returns,
	)

	return returns
}

func (i *jsiiProxy_ILogGroup) LogGroupPhysicalName() *string {
	var returns *string

	_jsii_.Invoke(
		i,
		"logGroupPhysicalName",
		nil, // no parameters
		&returns,
	)

	return returns
}

func (i *jsiiProxy_ILogGroup) Metric(metricName *string, props *awscloudwatch.MetricOptions) awscloudwatch.Metric {
	if err := i.validateMetricParameters(metricName, props); err != nil {
		panic(err)
	}
	var returns awscloudwatch.Metric

	_jsii_.Invoke(
		i,
		"metric",
		[]interface{}{metricName, props},
		&returns,
	)

	return returns
}

func (i *jsiiProxy_ILogGroup) MetricIncomingBytes(props *awscloudwatch.MetricOptions) awscloudwatch.Metric {
	if err := i.validateMetricIncomingBytesParameters(props); err != nil {
		panic(err)
	}
	var returns awscloudwatch.Metric

	_jsii_.Invoke(
		i,
		"metricIncomingBytes",
		[]interface{}{props},
		&returns,
	)

	return returns
}

func (i *jsiiProxy_ILogGroup) MetricIncomingLogEvents(props *awscloudwatch.MetricOptions) awscloudwatch.Metric {
	if err := i.validateMetricIncomingLogEventsParameters(props); err != nil {
		panic(err)
	}
	var returns awscloudwatch.Metric

	_jsii_.Invoke(
		i,
		"metricIncomingLogEvents",
		[]interface{}{props},
		&returns,
	)

	return returns
}

func (j *jsiiProxy_ILogGroup) LogGroupArn() *string {
	var returns *string
	_jsii_.Get(
		j,
		"logGroupArn",
		&returns,
	)
	return returns
}

func (j *jsiiProxy_ILogGroup) LogGroupName() *string {
	var returns *string
	_jsii_.Get(
		j,
		"logGroupName",
		&returns,
	)
	return returns
}

