import * as core from "@terrascript/core";

export interface UserPausedDetailsArgs extends core.SchemaArgs {
  jobExpiresAt: string | core.StringOut;

  jobImminentExpirationHealthEventArn: string | core.StringOut;

  jobPausedAt: string | core.StringOut;
}

export class UserPausedDetails extends core.Schema<UserPausedDetailsArgs> {
  @core.attr(String, { computed: true })
  public jobExpiresAt!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public jobImminentExpirationHealthEventArn!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public jobPausedAt!: string | core.StringOut;
}

export interface BucketDefinitionsArgs extends core.SchemaArgs {
  accountId: string | core.StringOut;

  buckets: core.Array<string> | core.ArrayOut<core.StringOut>;
}

export class BucketDefinitions extends core.Schema<BucketDefinitionsArgs> {
  @core.attr(String)
  public accountId!: string | core.StringOut;

  @core.attr(String, { kind: "array" })
  public buckets!: core.Array<string> | core.ArrayOut<core.StringOut>;
}

export interface SimpleCriterionArgs extends core.SchemaArgs {
  comparator?: string | core.StringOut;

  key?: string | core.StringOut;

  values?: core.Array<string> | core.ArrayOut<core.StringOut>;
}

export class SimpleCriterion extends core.Schema<SimpleCriterionArgs> {
  @core.attr(String, { computed: true })
  public comparator?: string | core.StringOut;

  @core.attr(String, { computed: true })
  public key?: string | core.StringOut;

  @core.attr(String, { computed: true, kind: "array" })
  public values?: core.Array<string> | core.ArrayOut<core.StringOut>;
}

export interface TagValuesArgs extends core.SchemaArgs {
  key?: string | core.StringOut;

  value?: string | core.StringOut;
}

export class TagValues extends core.Schema<TagValuesArgs> {
  @core.attr(String, { computed: true })
  public key?: string | core.StringOut;

  @core.attr(String, { computed: true })
  public value?: string | core.StringOut;
}

export interface TagCriterionArgs extends core.SchemaArgs {
  comparator?: string | core.StringOut;

  tagValues?: core.Array<TagValues> | core.ArrayOut<TagValues>;
}

export class TagCriterion extends core.Schema<TagCriterionArgs> {
  @core.attr(String, { computed: true })
  public comparator?: string | core.StringOut;

  @core.attr(TagValues, { kind: "array" })
  public tagValues?: core.Array<TagValues> | core.ArrayOut<TagValues>;
}

export interface BucketCriteriaExcludesAndArgs extends core.SchemaArgs {
  simpleCriterion?: SimpleCriterion;

  tagCriterion?: TagCriterion;
}

export class BucketCriteriaExcludesAnd extends core.Schema<BucketCriteriaExcludesAndArgs> {
  @core.attr(SimpleCriterion, { computed: true })
  public simpleCriterion?: SimpleCriterion;

  @core.attr(TagCriterion, { computed: true })
  public tagCriterion?: TagCriterion;
}

export interface BucketCriteriaExcludesArgs extends core.SchemaArgs {
  and?:
    | core.Array<BucketCriteriaExcludesAnd>
    | core.ArrayOut<BucketCriteriaExcludesAnd>;
}

export class BucketCriteriaExcludes extends core.Schema<BucketCriteriaExcludesArgs> {
  @core.attr(BucketCriteriaExcludesAnd, { computed: true, kind: "array" })
  public and?:
    | core.Array<BucketCriteriaExcludesAnd>
    | core.ArrayOut<BucketCriteriaExcludesAnd>;
}

export interface BucketCriteriaIncludesArgs extends core.SchemaArgs {
  and?:
    | core.Array<BucketCriteriaExcludesAnd>
    | core.ArrayOut<BucketCriteriaExcludesAnd>;
}

export class BucketCriteriaIncludes extends core.Schema<BucketCriteriaIncludesArgs> {
  @core.attr(BucketCriteriaExcludesAnd, { computed: true, kind: "array" })
  public and?:
    | core.Array<BucketCriteriaExcludesAnd>
    | core.ArrayOut<BucketCriteriaExcludesAnd>;
}

export interface BucketCriteriaArgs extends core.SchemaArgs {
  excludes?: BucketCriteriaExcludes;

  includes?: BucketCriteriaIncludes;
}

export class BucketCriteria extends core.Schema<BucketCriteriaArgs> {
  @core.attr(BucketCriteriaExcludes, { computed: true })
  public excludes?: BucketCriteriaExcludes;

  @core.attr(BucketCriteriaIncludes, { computed: true })
  public includes?: BucketCriteriaIncludes;
}

export interface ScopingExcludesAndTagScopeTermArgs extends core.SchemaArgs {
  comparator?: string | core.StringOut;

  key?: string | core.StringOut;

  tagValues?: core.Array<TagValues> | core.ArrayOut<TagValues>;

  target?: string | core.StringOut;
}

export class ScopingExcludesAndTagScopeTerm extends core.Schema<ScopingExcludesAndTagScopeTermArgs> {
  @core.attr(String, { computed: true })
  public comparator?: string | core.StringOut;

  @core.attr(String, { computed: true })
  public key?: string | core.StringOut;

  @core.attr(TagValues, { computed: true, kind: "array" })
  public tagValues?: core.Array<TagValues> | core.ArrayOut<TagValues>;

  @core.attr(String, { computed: true })
  public target?: string | core.StringOut;
}

export interface SimpleScopeTermArgs extends core.SchemaArgs {
  comparator?: string | core.StringOut;

  key?: string | core.StringOut;

  values?: core.Array<string> | core.ArrayOut<core.StringOut>;
}

export class SimpleScopeTerm extends core.Schema<SimpleScopeTermArgs> {
  @core.attr(String, { computed: true })
  public comparator?: string | core.StringOut;

  @core.attr(String, { computed: true })
  public key?: string | core.StringOut;

  @core.attr(String, { computed: true, kind: "array" })
  public values?: core.Array<string> | core.ArrayOut<core.StringOut>;
}

export interface ScopingExcludesAndArgs extends core.SchemaArgs {
  simpleScopeTerm?: SimpleScopeTerm;

  tagScopeTerm?: ScopingExcludesAndTagScopeTerm;
}

export class ScopingExcludesAnd extends core.Schema<ScopingExcludesAndArgs> {
  @core.attr(SimpleScopeTerm, { computed: true })
  public simpleScopeTerm?: SimpleScopeTerm;

  @core.attr(ScopingExcludesAndTagScopeTerm, { computed: true })
  public tagScopeTerm?: ScopingExcludesAndTagScopeTerm;
}

export interface ScopingExcludesArgs extends core.SchemaArgs {
  and?: core.Array<ScopingExcludesAnd> | core.ArrayOut<ScopingExcludesAnd>;
}

export class ScopingExcludes extends core.Schema<ScopingExcludesArgs> {
  @core.attr(ScopingExcludesAnd, { computed: true, kind: "array" })
  public and?:
    | core.Array<ScopingExcludesAnd>
    | core.ArrayOut<ScopingExcludesAnd>;
}

export interface ScopingIncludesAndTagScopeTermArgs extends core.SchemaArgs {
  comparator?: string | core.StringOut;

  key?: string | core.StringOut;

  tagValues?: core.Array<TagValues> | core.ArrayOut<TagValues>;

  target?: string | core.StringOut;
}

export class ScopingIncludesAndTagScopeTerm extends core.Schema<ScopingIncludesAndTagScopeTermArgs> {
  @core.attr(String, { computed: true })
  public comparator?: string | core.StringOut;

  @core.attr(String, { computed: true })
  public key?: string | core.StringOut;

  @core.attr(TagValues, { kind: "array" })
  public tagValues?: core.Array<TagValues> | core.ArrayOut<TagValues>;

  @core.attr(String, { computed: true })
  public target?: string | core.StringOut;
}

export interface ScopingIncludesAndArgs extends core.SchemaArgs {
  simpleScopeTerm?: SimpleScopeTerm;

  tagScopeTerm?: ScopingIncludesAndTagScopeTerm;
}

export class ScopingIncludesAnd extends core.Schema<ScopingIncludesAndArgs> {
  @core.attr(SimpleScopeTerm, { computed: true })
  public simpleScopeTerm?: SimpleScopeTerm;

  @core.attr(ScopingIncludesAndTagScopeTerm, { computed: true })
  public tagScopeTerm?: ScopingIncludesAndTagScopeTerm;
}

export interface ScopingIncludesArgs extends core.SchemaArgs {
  and?: core.Array<ScopingIncludesAnd> | core.ArrayOut<ScopingIncludesAnd>;
}

export class ScopingIncludes extends core.Schema<ScopingIncludesArgs> {
  @core.attr(ScopingIncludesAnd, { computed: true, kind: "array" })
  public and?:
    | core.Array<ScopingIncludesAnd>
    | core.ArrayOut<ScopingIncludesAnd>;
}

export interface ScopingArgs extends core.SchemaArgs {
  excludes?: ScopingExcludes;

  includes?: ScopingIncludes;
}

export class Scoping extends core.Schema<ScopingArgs> {
  @core.attr(ScopingExcludes, { computed: true })
  public excludes?: ScopingExcludes;

  @core.attr(ScopingIncludes, { computed: true })
  public includes?: ScopingIncludes;
}

export interface S3JobDefinitionArgs extends core.SchemaArgs {
  bucketCriteria?: BucketCriteria;

  bucketDefinitions?:
    | core.Array<BucketDefinitions>
    | core.ArrayOut<BucketDefinitions>;

  scoping?: Scoping;
}

export class S3JobDefinition extends core.Schema<S3JobDefinitionArgs> {
  @core.attr(BucketCriteria, { computed: true })
  public bucketCriteria?: BucketCriteria;

  @core.attr(BucketDefinitions, { kind: "array" })
  public bucketDefinitions?:
    | core.Array<BucketDefinitions>
    | core.ArrayOut<BucketDefinitions>;

  @core.attr(Scoping, { computed: true })
  public scoping?: Scoping;
}

export interface ScheduleFrequencyArgs extends core.SchemaArgs {
  dailySchedule?: boolean | core.BooleanOut;

  monthlySchedule?: number | core.NumberOut;

  weeklySchedule?: string | core.StringOut;
}

export class ScheduleFrequency extends core.Schema<ScheduleFrequencyArgs> {
  @core.attr(Boolean)
  public dailySchedule?: boolean | core.BooleanOut;

  @core.attr(Number, { computed: true })
  public monthlySchedule?: number | core.NumberOut;

  @core.attr(String, { computed: true })
  public weeklySchedule?: string | core.StringOut;
}

export interface ClassificationJobArgs extends core.ResourceArgs {
  customDataIdentifierIds?: core.Array<string> | core.ArrayOut<core.StringOut>;

  description?: string | core.StringOut;

  initialRun?: boolean | core.BooleanOut;

  jobStatus?: string | core.StringOut;

  jobType: string | core.StringOut;

  name?: string | core.StringOut;

  namePrefix?: string | core.StringOut;

  s3JobDefinition: S3JobDefinition;

  samplingPercentage?: number | core.NumberOut;

  scheduleFrequency?: ScheduleFrequency;

  tags?: core.Map<string, string> | core.MapOut<core.StringOut>;

  tagsAll?: core.Map<string, string> | core.MapOut<core.StringOut>;
}

export class ClassificationJob extends core.Resource<ClassificationJobArgs> {
  @core.attr(String, { computed: true })
  public createdAt!: string | core.StringOut;

  @core.attr(String, { computed: true, kind: "array" })
  public customDataIdentifierIds?:
    | core.Array<string>
    | core.ArrayOut<core.StringOut>;

  @core.attr(String, { computed: true })
  public description?: string | core.StringOut;

  @core.attr(String, { computed: true })
  public id!: string | core.StringOut;

  @core.attr(Boolean)
  public initialRun?: boolean | core.BooleanOut;

  @core.attr(String, { computed: true })
  public jobArn!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public jobId!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public jobStatus?: string | core.StringOut;

  @core.attr(String)
  public jobType!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public name?: string | core.StringOut;

  @core.attr(String, { computed: true })
  public namePrefix?: string | core.StringOut;

  @core.attr(S3JobDefinition)
  public s3JobDefinition!: S3JobDefinition;

  @core.attr(Number, { computed: true })
  public samplingPercentage?: number | core.NumberOut;

  @core.attr(ScheduleFrequency, { computed: true })
  public scheduleFrequency?: ScheduleFrequency;

  @core.attr(String, { kind: "map" })
  public tags?: core.Map<string, string> | core.MapOut<core.StringOut>;

  @core.attr(String, { computed: true, kind: "map" })
  public tagsAll?: core.Map<string, string> | core.MapOut<core.StringOut>;

  @core.attr(UserPausedDetails, { computed: true, kind: "array" })
  public userPausedDetails!:
    | core.Array<UserPausedDetails>
    | core.ArrayOut<UserPausedDetails>;

  constructor(name: string, args?: ClassificationJobArgs) {
    super(name, "aws_macie2_classification_job", args);
  }

  public override getNamespace(): string {
    return "aws_macie2";
  }
}
