/**
 * Cookie Consent DTOs
 * GDPR compliant consent management
 */

import { IsBoolean, IsOptional, IsString, IsEnum } from 'class-validator';
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';

/**
 * Request DTO for recording/updating cookie consent
 */
export class UpdateConsentDto {
  @ApiProperty({
    example: true,
    description: 'Essential cookies consent (always true, required for functionality)',
    default: true,
  })
  @IsBoolean()
  essential: boolean;

  @ApiProperty({
    example: false,
    description: 'Functional cookies consent (preferences, language, etc.)',
    default: false,
  })
  @IsBoolean()
  functional: boolean;

  @ApiProperty({
    example: false,
    description: 'Analytics cookies consent (Google Analytics, Sentry, etc.)',
    default: false,
  })
  @IsBoolean()
  analytics: boolean;

  @ApiProperty({
    example: false,
    description: 'Marketing cookies consent (ads, tracking, remarketing)',
    default: false,
  })
  @IsBoolean()
  marketing: boolean;

  @ApiPropertyOptional({
    example: '192.168.1.1',
    description: 'IP address at time of consent (for GDPR audit trail)',
  })
  @IsOptional()
  @IsString()
  ipAddress?: string;

  @ApiPropertyOptional({
    example: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
    description: 'User agent at time of consent',
  })
  @IsOptional()
  @IsString()
  userAgent?: string;
}

/**
 * Response DTO for consent status
 */
export class ConsentResponseDto {
  @ApiProperty({
    example: '550e8400-e29b-41d4-a716-446655440000',
    description: 'User ID',
  })
  userId: string;

  @ApiProperty({
    example: true,
    description: 'Essential cookies consent (always true)',
  })
  essential: boolean;

  @ApiProperty({
    example: false,
    description: 'Functional cookies consent',
  })
  functional: boolean;

  @ApiProperty({
    example: false,
    description: 'Analytics cookies consent',
  })
  analytics: boolean;

  @ApiProperty({
    example: false,
    description: 'Marketing cookies consent',
  })
  marketing: boolean;

  @ApiProperty({
    example: '2025-01-27T10:30:00.000Z',
    description: 'Date when consent was recorded',
  })
  consentDate: Date;

  @ApiProperty({
    example: '2025-01-27T10:30:00.000Z',
    description: 'Last update timestamp',
  })
  updatedAt: Date;
}

/**
 * Request DTO for withdrawing specific consent
 */
export class WithdrawConsentDto {
  @ApiProperty({
    example: 'marketing',
    description: 'Type of consent to withdraw',
    enum: ['functional', 'analytics', 'marketing'],
  })
  @IsEnum(['functional', 'analytics', 'marketing'], {
    message: 'Consent type must be functional, analytics, or marketing',
  })
  consentType: 'functional' | 'analytics' | 'marketing';
}

/**
 * Success response DTO
 */
export class ConsentSuccessDto {
  @ApiProperty({
    example: true,
    description: 'Operation success status',
  })
  success: boolean;

  @ApiProperty({
    example: 'Consent preferences saved successfully',
    description: 'Response message',
  })
  message: string;
}
