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

export interface GrantArgs extends core.SchemaArgs {
  email?: string | core.StringOut;

  id?: string | core.StringOut;

  permissions: core.Array<string> | core.ArrayOut<core.StringOut>;

  type: string | core.StringOut;

  uri?: string | core.StringOut;
}

export class Grant extends core.Schema<GrantArgs> {
  @core.attr(String)
  public email?: string | core.StringOut;

  @core.attr(String)
  public id?: string | core.StringOut;

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

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

  @core.attr(String)
  public uri?: string | core.StringOut;
}

export interface ObjectCopyArgs extends core.ResourceArgs {
  acl?: string | core.StringOut;

  bucket: string | core.StringOut;

  bucketKeyEnabled?: boolean | core.BooleanOut;

  cacheControl?: string | core.StringOut;

  contentDisposition?: string | core.StringOut;

  contentEncoding?: string | core.StringOut;

  contentLanguage?: string | core.StringOut;

  contentType?: string | core.StringOut;

  copyIfMatch?: string | core.StringOut;

  copyIfModifiedSince?: string | core.StringOut;

  copyIfNoneMatch?: string | core.StringOut;

  copyIfUnmodifiedSince?: string | core.StringOut;

  customerAlgorithm?: string | core.StringOut;

  customerKey?: string | core.StringOut;

  customerKeyMd5?: string | core.StringOut;

  expectedBucketOwner?: string | core.StringOut;

  expectedSourceBucketOwner?: string | core.StringOut;

  expires?: string | core.StringOut;

  forceDestroy?: boolean | core.BooleanOut;

  grant?: core.Array<Grant> | core.ArrayOut<Grant>;

  key: string | core.StringOut;

  kmsEncryptionContext?: string | core.StringOut;

  kmsKeyId?: string | core.StringOut;

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

  metadataDirective?: string | core.StringOut;

  objectLockLegalHoldStatus?: string | core.StringOut;

  objectLockMode?: string | core.StringOut;

  objectLockRetainUntilDate?: string | core.StringOut;

  requestPayer?: string | core.StringOut;

  serverSideEncryption?: string | core.StringOut;

  source: string | core.StringOut;

  sourceCustomerAlgorithm?: string | core.StringOut;

  sourceCustomerKey?: string | core.StringOut;

  sourceCustomerKeyMd5?: string | core.StringOut;

  storageClass?: string | core.StringOut;

  taggingDirective?: string | core.StringOut;

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

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

  websiteRedirect?: string | core.StringOut;
}

export class ObjectCopy extends core.Resource<ObjectCopyArgs> {
  @core.attr(String)
  public acl?: string | core.StringOut;

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

  @core.attr(Boolean, { computed: true })
  public bucketKeyEnabled?: boolean | core.BooleanOut;

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

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

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

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

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

  @core.attr(String)
  public copyIfMatch?: string | core.StringOut;

  @core.attr(String)
  public copyIfModifiedSince?: string | core.StringOut;

  @core.attr(String)
  public copyIfNoneMatch?: string | core.StringOut;

  @core.attr(String)
  public copyIfUnmodifiedSince?: string | core.StringOut;

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

  @core.attr(String)
  public customerKey?: string | core.StringOut;

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

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

  @core.attr(String)
  public expectedBucketOwner?: string | core.StringOut;

  @core.attr(String)
  public expectedSourceBucketOwner?: string | core.StringOut;

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

  @core.attr(String)
  public expires?: string | core.StringOut;

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

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

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

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

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

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

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

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

  @core.attr(String)
  public metadataDirective?: string | core.StringOut;

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

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

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

  @core.attr(Boolean, { computed: true })
  public requestCharged!: boolean | core.BooleanOut;

  @core.attr(String)
  public requestPayer?: string | core.StringOut;

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

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

  @core.attr(String)
  public sourceCustomerAlgorithm?: string | core.StringOut;

  @core.attr(String)
  public sourceCustomerKey?: string | core.StringOut;

  @core.attr(String)
  public sourceCustomerKeyMd5?: string | core.StringOut;

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

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

  @core.attr(String)
  public taggingDirective?: string | core.StringOut;

  @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(String, { computed: true })
  public versionId!: string | core.StringOut;

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

  constructor(name: string, args?: ObjectCopyArgs) {
    super(name, "aws_s3_object_copy", args);
  }

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