import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger";
import { Type } from "class-transformer";
import { IsArray, IsBoolean, IsDateString, IsInt, IsNumber, IsOptional, IsString, Max, Min, ValidateNested } from "class-validator";

// Route interface for discovered routes
export class DiscoveredRouteDto {
  @ApiProperty({
    description: 'Route path',
    example: '/products',
  })
  path: string;

  @ApiProperty({
    description: 'Content hash of the route',
    example: 'a1b2c3d4e5f6...',
  })
  contentHash: string;

  @ApiProperty({
    description: 'Last checked timestamp',
    example: '2024-01-01T00:00:00.000Z',
  })
  lastChecked: Date;

  @ApiProperty({
    description: 'Route status',
    enum: ['active', 'inactive', 'changed'],
    example: 'active',
  })
  status: 'active' | 'inactive' | 'changed';

  @ApiPropertyOptional({
    description: 'HTTP status code',
    example: 200,
  })
  httpStatus?: number;
}

export class CreateBreachCheckWebsiteBaselineDto {
  @ApiProperty({
    description: 'Website ID',
    example: 1,
  })
  @IsNumber()
  websiteId: number;

  @ApiPropertyOptional({
    description: 'Primary MD5 hash of main content',
    example: 'a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6',
    maxLength: 64,
  })
  @IsString()
  @IsOptional()
  mainContentHash?: string;

  @ApiPropertyOptional({
    description: 'JSON snapshot of content signature',
    example: '{"title": "Home Page", "headings": ["Welcome", "About Us"]}',
  })
  @IsString()
  @IsOptional()
  contentSnapshot?: string;

  @ApiPropertyOptional({
    description: 'Hash of page title',
    maxLength: 64,
  })
  @IsString()
  @IsOptional()
  titleHash?: string;

  @ApiPropertyOptional({
    description: 'Hash of page structure',
    maxLength: 64,
  })
  @IsString()
  @IsOptional()
  structureHash?: string;

  @ApiPropertyOptional({
    description: 'Hash of main body text content',
    maxLength: 64,
  })
  @IsString()
  @IsOptional()
  bodyTextHash?: string;

  @ApiPropertyOptional({
    description: 'Hash of meta description',
    maxLength: 64,
  })
  @IsString()
  @IsOptional()
  metaDescHash?: string;

  @ApiPropertyOptional({
    description: 'Last content update timestamp',
    example: '2024-01-01T00:00:00.000Z',
  })
  @IsDateString()
  @IsOptional()
  lastContentUpdate?: Date;

  @ApiPropertyOptional({
    description: 'Expected HTTP status code',
    example: 200,
    minimum: 100,
    maximum: 599,
  })
  @IsInt()
  @Min(100)
  @Max(599)
  @IsOptional()
  httpStatusBaseline?: number;

  @ApiPropertyOptional({
    description: 'Array of discovered routes',
    type: [DiscoveredRouteDto],
    example: [
      {
        path: '/products',
        contentHash: 'abc123...',
        lastChecked: '2024-01-01T00:00:00.000Z',
        status: 'active',
        httpStatus: 200,
      },
    ],
  })
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => DiscoveredRouteDto)
  @IsOptional()
  discoveredRoutes?: DiscoveredRouteDto[];

  @ApiPropertyOptional({
    description: 'Hash of all routes structure',
    maxLength: 64,
  })
  @IsString()
  @IsOptional()
  routesHash?: string;

  @ApiPropertyOptional({
    description: 'Last crawl update timestamp',
    example: '2024-01-01T00:00:00.000Z',
  })
  @IsDateString()
  @IsOptional()
  lastCrawlUpdate?: Date;

  @ApiPropertyOptional({
    description: 'Whether to use AI analysis for content changes',
    default: true,
  })
  @IsBoolean()
  @IsOptional()
  aiAnalysisEnabled?: boolean = true;

  @ApiPropertyOptional({
    description: 'Whether to enable route crawling and monitoring',
    default: true,
  })
  @IsBoolean()
  @IsOptional()
  crawlingEnabled?: boolean = true;

  @ApiPropertyOptional({
    description: 'Maximum depth for route crawling',
    example: 2,
    minimum: 1,
    maximum: 10,
    default: 2,
  })
  @IsInt()
  @Min(1)
  @Max(10)
  @IsOptional()
  maxCrawlDepth?: number = 2;

  @ApiPropertyOptional({
    description: 'Maximum number of URLs to crawl',
    example: 20,
    minimum: 1,
    maximum: 100,
    default: 20,
  })
  @IsInt()
  @Min(1)
  @Max(100)
  @IsOptional()
  maxCrawlUrls?: number = 20;

  @ApiPropertyOptional({
    description: 'Last updated timestamp',
    example: '2024-01-01T00:00:00.000Z',
  })
  @IsDateString()
  @IsOptional()
  lastUpdated?: Date;

  @ApiPropertyOptional({
    description: 'Version number of the baseline',
    example: 1,
    minimum: 1,
    default: 1,
  })
  @IsInt()
  @Min(1)
  @IsOptional()
  baselineVersion?: number = 1;

  @ApiPropertyOptional({
    description: 'Sensitivity level for defacement detection',
    example: 50,
    minimum: 0,
    maximum: 100,
    default: 50,
  })
  @IsInt()
  @Min(0)
  @Max(100)
  @IsOptional()
  sensitivityLevel?: number = 50;
}
