import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { IsDateString, IsIn, IsNumber, IsOptional, IsString, IsUUID, Max, MaxLength, Min } from 'class-validator';

export const TIPOS_ACTIVIDAD = ['tarea', 'llamada', 'reunion', 'visita', 'whatsapp', 'email', 'demo'] as const;

export class CreateActividadDto {
  @ApiProperty({ enum: TIPOS_ACTIVIDAD })
  @IsIn(TIPOS_ACTIVIDAD as unknown as string[])
  tipo: string;

  @ApiProperty({ example: 'Llamar para confirmar la propuesta' })
  @IsString()
  @MaxLength(200)
  asunto: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  detalle?: string;

  @ApiPropertyOptional({ description: 'Al menos uno de oportunidad/cliente/lead/ticket.' })
  @IsOptional()
  @IsUUID()
  oportunidad_id?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsUUID()
  cliente_id?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsUUID()
  lead_id?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsUUID()
  ticket_id?: string;

  @ApiPropertyOptional({ description: 'Por defecto, el usuario que la crea.' })
  @IsOptional()
  @IsUUID()
  usuario_id?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsUUID()
  vendedor_id?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsUUID()
  sucursal_id?: string;

  @ApiProperty({ example: '2026-10-05T14:00:00.000Z' })
  @IsDateString()
  fecha_programada: string;
}

export class UpdateActividadDto {
  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  @MaxLength(200)
  asunto?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  detalle?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsDateString()
  fecha_programada?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsUUID()
  usuario_id?: string;
}

export class CompletarActividadDto {
  @ApiProperty({
    example: 'Atendió, pide la propuesta por escrito antes del viernes.',
    description: 'Obligatorio: una actividad cerrada sin resultado no deja aprender nada.',
  })
  @IsString()
  @MaxLength(4000)
  resultado: string;

  @ApiPropertyOptional({ description: 'Si se omite, se toma el momento del cierre.' })
  @IsOptional()
  @IsDateString()
  fecha_realizada?: string;
}

export class CheckGeoDto {
  @ApiProperty({ example: -25.2637 })
  @IsNumber()
  @Min(-90)
  @Max(90)
  geo_lat: number;

  @ApiProperty({ example: -57.5759 })
  @IsNumber()
  @Min(-180)
  @Max(180)
  geo_lng: number;
}
