import { ApiProperty } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import {
  ArrayMaxSize,
  ArrayMinSize,
  IsArray,
  IsIn,
  IsInt,
  IsNotEmpty,
  IsNumberString,
  MaxLength,
  Min,
  MinLength,
} from 'class-validator';

export class AudioUploadLocationRequest {}

export class AudioUploadLocationResponse {
  @ApiProperty({
    description: 'Blob StorageにアクセスするためのSASトークン入りのアクセスURL',
  })
  url: string;
}

export class AudioDownloadLocationRequest {
  @ApiProperty({ description: 'ODMSCloud上で管理する音声ファイルのID' })
  @Type(() => Number)
  @Min(1)
  @IsInt()
  audioFileId: number;
}

export class AudioDownloadLocationResponse {
  @ApiProperty({
    description: 'Blob StorageにアクセスするためのSASトークン入りのアクセスURL',
  })
  url: string;
}

export class TemplateDownloadLocationRequest {
  @ApiProperty({ description: '文字起こし対象の音声ファイルID' })
  @Type(() => Number)
  @Min(1)
  @IsInt()
  audioFileId: number;
}

export class TemplateDownloadLocationResponse {
  @ApiProperty()
  url: string;
}

export class TemplateUploadLocationResponse {
  @ApiProperty()
  url: string;
}

export class AudioOptionItem {
  @ApiProperty({ minLength: 1, maxLength: 16 })
  @MinLength(1)
  @MaxLength(16)
  optionItemLabel: string;
  @ApiProperty({ minLength: 1, maxLength: 20 })
  @MinLength(1)
  @MaxLength(20)
  optionItemValue: string;
}

export class AudioUploadFinishedRequest {
  @ApiProperty({ description: 'アップロード先Blob Storage(ファイル名含む)' })
  @IsNotEmpty()
  url: string;
  @ApiProperty({ description: '自分自身(ログイン認証)したAuthorID' })
  @IsNotEmpty()
  authorId: string;
  @ApiProperty({ description: '音声ファイル名' })
  @IsNotEmpty()
  fileName: string;
  @ApiProperty({
    description: '音声ファイルの録音時間（ミリ秒の整数値）',
  })
  @IsNumberString()
  @IsNotEmpty()
  duration: string;
  @ApiProperty({
    description:
      '音声ファイルの録音作成日時(開始日時)（yyyy-mm-ddThh:mm:ss.sss）',
  })
  @IsNotEmpty()
  createdDate: string;
  @ApiProperty({
    description: '音声ファイルの録音作成終了日時（yyyy-mm-ddThh:mm:ss.sss）',
  })
  @IsNotEmpty()
  finishedDate: string;
  @ApiProperty({
    description: '音声ファイルのアップロード日時（yyyy-mm-ddThh:mm:ss.sss）',
  })
  @IsNotEmpty()
  uploadedDate: string;
  @ApiProperty({ description: '音声ファイルのファイルサイズ（Byte）' })
  @Type(() => Number)
  @IsInt()
  @IsNotEmpty()
  fileSize: number;
  @ApiProperty({ description: '優先度 "00":Normal / "01":High' })
  @IsIn(['00', '01'], { message: 'invalid priority' })
  @IsNotEmpty()
  priority: string;
  @ApiProperty({ description: '録音形式: DSS/DS2(SP)/DS2(QP)' })
  @IsNotEmpty()
  audioFormat: string;
  @ApiProperty()
  comment: string;
  @ApiProperty()
  workType: string;
  @ApiProperty({
    type: [AudioOptionItem],
    maxItems: 10,
    minItems: 10,
    description: '音声ファイルに紐づくOption Itemの一覧（10個固定）',
  })
  @IsArray()
  @ArrayMinSize(10)
  @ArrayMaxSize(10)
  optionItemList: AudioOptionItem[];
  @ApiProperty()
  isEncrypted: boolean;
}

export class AudioUploadFinishedResponse {
  @ApiProperty({ description: '8桁固定の数字' })
  jobNumber: string;
}

export class TemplateUploadFinishedRequest {
  @ApiProperty({ description: 'テンプレートファイルのファイル名' })
  name: string;
  @ApiProperty({ description: 'テンプレートファイルのアップロード先URL' })
  url: string;
}

export class TemplateUploadFinishedReqponse {}
