import { ApiProperty } from '@nestjs/swagger';
import { Assignee } from '../../tasks/types/types';
import { ArrayMinSize, IsArray, IsInt, IsOptional, Min } from 'class-validator';
import { Type } from 'class-transformer';
import { Author } from '../../accounts/types/types';

export class WorkflowWorktype {
  @ApiProperty({ description: 'Worktypeの内部ID' })
  id: number;
  @ApiProperty({ description: 'WorktypeID' })
  worktypeId: string;
}

export class WorkflowTemplate {
  @ApiProperty({ description: 'テンプレートの内部ID' })
  id: number;
  @ApiProperty({ description: 'テンプレートのファイル名' })
  fileName: string;
}

export class Workflow {
  @ApiProperty({ description: 'ワークフローの内部ID' })
  id: number;
  @ApiProperty({ description: 'Author情報' })
  author: Author;
  @ApiProperty({ description: 'Worktype情報', required: false })
  worktype?: WorkflowWorktype;
  @ApiProperty({ description: 'テンプレート情報', required: false })
  template?: WorkflowTemplate;
  @ApiProperty({
    description: 'ルーティング候補のタイピストユーザー/タイピストグループ',
    type: [Assignee],
  })
  typists: Assignee[];
}

export class GetWorkflowsResponse {
  @ApiProperty({
    description: 'ワークフローの一覧',
    type: [Workflow],
  })
  workflows: Workflow[];
}

export class WorkflowTypist {
  @ApiProperty({ description: 'タイピストユーザーの内部ID', required: false })
  @IsOptional()
  @IsInt()
  @Type(() => Number)
  typistId?: number;
  @ApiProperty({ description: 'タイピストグループの内部ID', required: false })
  @IsOptional()
  @IsInt()
  @Type(() => Number)
  typistGroupId?: number;
}

export class CreateWorkflowsRequest {
  @ApiProperty({ description: 'Authorの内部ID' })
  @Type(() => Number)
  @IsInt()
  @Min(1)
  authorId: number;
  @ApiProperty({ description: 'Worktypeの内部ID', required: false })
  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  worktypeId?: number;
  @ApiProperty({ description: 'テンプレートの内部ID', required: false })
  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  templateId?: number;
  @ApiProperty({
    description: 'ルーティング候補のタイピストユーザー/タイピストグループ',
    type: [WorkflowTypist],
    minItems: 1,
  })
  @Type(() => WorkflowTypist)
  @IsArray()
  @ArrayMinSize(1)
  typists: WorkflowTypist[];
}

export class CreateWorkflowsResponse {}

export class UpdateWorkflowRequestParam {
  @ApiProperty({ description: 'ワークフローの内部ID' })
  @Type(() => Number)
  @IsInt()
  @Min(1)
  workflowId: number;
}

export class UpdateWorkflowRequest {
  @ApiProperty({ description: 'Authorの内部ID' })
  @Type(() => Number)
  @IsInt()
  @Min(1)
  authorId: number;
  @ApiProperty({ description: 'Worktypeの内部ID', required: false })
  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  worktypeId?: number;
  @ApiProperty({ description: 'テンプレートの内部ID', required: false })
  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  templateId?: number;
  @ApiProperty({
    description: 'ルーティング候補のタイピストユーザー/タイピストグループ',
    type: [WorkflowTypist],
    minItems: 1,
  })
  @Type(() => WorkflowTypist)
  @IsArray()
  @ArrayMinSize(1)
  typists: WorkflowTypist[];
}

export class UpdateWorkflowResponse {}

export class DeleteWorkflowRequestParam {
  @ApiProperty({ description: 'ワークフローの内部ID' })
  @Type(() => Number)
  @IsInt()
  @Min(1)
  workflowId: number;
}

export class DeleteWorkflowResponse {}
