import {
  IsString,
  IsOptional,
  IsBoolean,
  IsNumber,
  IsArray,
  IsObject,
  IsUUID,
  MaxLength,
  MinLength,
  Min,
  Matches,
} from 'class-validator';

// ============================================
// ACCOUNT DTOs
// ============================================

export class CreateAccountDto {
  @IsString()
  @MaxLength(20)
  @Matches(/^\+?[1-9]\d{1,14}$/, { message: 'Invalid phone number format' })
  phoneNumber: string;

  @IsString()
  @MinLength(2)
  @MaxLength(100)
  displayName: string;

  @IsOptional()
  @IsString()
  @MaxLength(20)
  businessId?: string;

  @IsOptional()
  @IsString()
  @MaxLength(20)
  phoneNumberId?: string;

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

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

  @IsOptional()
  @IsObject()
  businessProfile?: {
    description?: string;
    email?: string;
    website?: string;
    address?: string;
    vertical?: string;
  };
}

export class UpdateAccountDto {
  @IsOptional()
  @IsString()
  @MaxLength(100)
  displayName?: string;

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

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

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

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

export class UpdateAccountStatusDto {
  @IsString()
  @MaxLength(20)
  status: string;
}

// ============================================
// CONTACT DTOs
// ============================================

export class CreateContactDto {
  @IsUUID()
  accountId: string;

  @IsString()
  @MaxLength(20)
  @Matches(/^\+?[1-9]\d{1,14}$/, { message: 'Invalid phone number format' })
  phoneNumber: string;

  @IsOptional()
  @IsString()
  @MaxLength(50)
  waId?: string;

  @IsOptional()
  @IsString()
  @MaxLength(200)
  profileName?: string;

  @IsOptional()
  @IsUUID()
  customerId?: string;

  @IsOptional()
  @IsUUID()
  userId?: string;

  @IsOptional()
  @IsArray()
  @IsString({ each: true })
  tags?: string[];

  @IsOptional()
  @IsString()
  notes?: string;
}

export class UpdateContactDto {
  @IsOptional()
  @IsString()
  @MaxLength(200)
  profileName?: string;

  @IsOptional()
  @IsUUID()
  customerId?: string;

  @IsOptional()
  @IsUUID()
  userId?: string;

  @IsOptional()
  @IsString()
  @MaxLength(20)
  conversationStatus?: string;

  @IsOptional()
  @IsArray()
  @IsString({ each: true })
  tags?: string[];

  @IsOptional()
  @IsString()
  notes?: string;
}

export class AddTagDto {
  @IsString()
  @MaxLength(50)
  tag: string;
}

// ============================================
// MESSAGE DTOs
// ============================================

export class CreateMessageDto {
  @IsUUID()
  accountId: string;

  @IsUUID()
  contactId: string;

  @IsString()
  @MaxLength(10)
  direction: string;

  @IsString()
  @MaxLength(20)
  messageType: string;

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

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

  @IsOptional()
  @IsString()
  @MaxLength(100)
  mediaId?: string;

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

  @IsOptional()
  @IsString()
  @MaxLength(100)
  mediaMimeType?: string;

  @IsOptional()
  @IsUUID()
  templateId?: string;

  @IsOptional()
  @IsString()
  @MaxLength(512)
  templateName?: string;

  @IsOptional()
  @IsArray()
  templateVariables?: string[];

  @IsOptional()
  @IsString()
  @MaxLength(30)
  interactiveType?: string;

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

  @IsOptional()
  @IsString()
  @MaxLength(100)
  contextMessageId?: string;

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

export class UpdateMessageStatusDto {
  @IsString()
  @MaxLength(20)
  status: string;

  @IsOptional()
  @IsString()
  timestamp?: string;
}

export class MessageErrorDto {
  @IsString()
  @MaxLength(20)
  errorCode: string;

  @IsString()
  errorMessage: string;
}

// ============================================
// TEMPLATE DTOs
// ============================================

export class CreateTemplateDto {
  @IsUUID()
  accountId: string;

  @IsString()
  @MinLength(1)
  @MaxLength(512)
  name: string;

  @IsString()
  @MinLength(2)
  @MaxLength(200)
  displayName: string;

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

  @IsString()
  @MaxLength(30)
  category: string;

  @IsOptional()
  @IsString()
  @MaxLength(10)
  language?: string;

  @IsOptional()
  @IsString()
  @MaxLength(20)
  headerType?: string;

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

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

  @IsString()
  bodyText: string;

  @IsOptional()
  @IsArray()
  @IsString({ each: true })
  bodyVariables?: string[];

  @IsOptional()
  @IsString()
  @MaxLength(60)
  footerText?: string;

  @IsOptional()
  @IsArray()
  buttons?: Record<string, any>[];
}

export class UpdateTemplateDto {
  @IsOptional()
  @IsString()
  @MaxLength(200)
  displayName?: string;

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

  @IsOptional()
  @IsString()
  @MaxLength(20)
  headerType?: string;

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

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

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

  @IsOptional()
  @IsArray()
  @IsString({ each: true })
  bodyVariables?: string[];

  @IsOptional()
  @IsString()
  @MaxLength(60)
  footerText?: string;

  @IsOptional()
  @IsArray()
  buttons?: Record<string, any>[];

  @IsOptional()
  @IsBoolean()
  isActive?: boolean;
}

export class UpdateTemplateStatusDto {
  @IsString()
  @MaxLength(20)
  metaStatus: string;

  @IsOptional()
  @IsString()
  @MaxLength(50)
  metaTemplateId?: string;

  @IsOptional()
  @IsString()
  rejectionReason?: string;
}
