import {
  IsString,
  IsNotEmpty,
  IsOptional,
  IsEnum,
  IsObject,
  IsArray,
  IsUUID,
  ValidateNested,
  Matches,
} from 'class-validator';
import { Type } from 'class-transformer';

export enum WorkflowRuleType {
  ORGANIZATION_RELATION = 'ORGANIZATION_RELATION',
  SYSTEM_ROLE_MAPPING = 'SYSTEM_ROLE_MAPPING',
  FIXED_USERS = 'FIXED_USERS',
  DYNAMIC_SCRIPT = 'DYNAMIC_SCRIPT',
}

export class CreateWorkflowRoleDto {
  @IsString()
  @IsNotEmpty()
  name: string;

  @IsString()
  @IsNotEmpty()
  @Matches(/^WF_/, {
    message: '流程角色代码必须以 WF_ 开头',
  })
  code: string;

  @IsString()
  @IsOptional()
  description?: string;

  @IsEnum(WorkflowRuleType)
  ruleType: WorkflowRuleType;

  @IsObject()
  @IsOptional()
  ruleConfig?: Record<string, any>;
}

export class UpdateWorkflowRoleDto {
  @IsString()
  @IsOptional()
  name?: string;

  @IsString()
  @IsOptional()
  description?: string;

  @IsEnum(WorkflowRuleType)
  @IsOptional()
  ruleType?: WorkflowRuleType;

  @IsObject()
  @IsOptional()
  ruleConfig?: Record<string, any>;
}

export class AssignWorkflowRoleUsersDto {
  @IsArray()
  @IsUUID('4', { each: true })
  userIds: string[];
}

export class WorkflowRoleQueryDto {
  @IsString()
  @IsOptional()
  keyword?: string;
}

// Resolve workflow role DTO
export class ResolveContextDto {
  @IsUUID()
  @IsNotEmpty()
  initiatorUserId: string;

  @IsObject()
  @IsOptional()
  formData?: Record<string, any>;
}

export class ResolveWorkflowRoleDto {
  @IsString()
  @IsNotEmpty()
  workflowRoleCode: string;

  @ValidateNested()
  @Type(() => ResolveContextDto)
  context: ResolveContextDto;
}

// Response types
export interface ResolvedUser {
  userId: string;
  displayName: string;
  email: string;
}

export interface ResolveResult {
  users: ResolvedUser[];
  strategy: 'ALL' | 'ANY';
  resolvedBy: WorkflowRuleType;
  fallbackUsed: boolean;
}
