import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { LeadType } from '../../common/constants/enums';
import {
  IsBoolean,
  IsEnum,
  IsISO8601,
  IsNumber,
  IsOptional,
  IsString,
} from 'class-validator';

class BasePunchDto {
  @ApiProperty({ example: '2026-06-15T10:00:00.000Z' })
  @IsISO8601()
  timestamp: string;

  @ApiProperty()
  @IsNumber()
  latitude: number;

  @ApiProperty()
  @IsNumber()
  longitude: number;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  address?: string;
}

export class DeparturePunchDto extends BasePunchDto {
  @ApiPropertyOptional()
  @IsOptional()
  @IsNumber()
  batteryPercent?: number;

  @ApiPropertyOptional()
  @IsOptional()
  @IsNumber()
  gpsAccuracy?: number;

  @ApiPropertyOptional()
  @IsOptional()
  @IsNumber()
  speed?: number;

  @ApiPropertyOptional()
  @IsOptional()
  @IsBoolean()
  isMockLocation?: boolean;
}

export class ArrivalPunchDto extends BasePunchDto {
  @ApiPropertyOptional()
  @IsOptional()
  @IsNumber()
  batteryPercent?: number;

  @ApiPropertyOptional()
  @IsOptional()
  @IsNumber()
  gpsAccuracy?: number;

  @ApiPropertyOptional()
  @IsOptional()
  @IsNumber()
  speed?: number;
}

export class MeetingStartPunchDto extends BasePunchDto {}

export class MeetingEndPunchDto extends BasePunchDto {
  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  meetingSummary?: string;

  @ApiPropertyOptional({ enum: LeadType })
  @IsOptional()
  @IsEnum(LeadType)
  leadType?: LeadType;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  customerNotes?: string;
}
