import { z } from 'zod';
import { createZodDto } from 'nestjs-zod';

export const DeviceLocationSchema = z.object({
  latitude: z.number().min(-90).max(90),
  longitude: z.number().min(-180).max(180),
  accuracy_m: z.number().min(0).nullable().optional(),
});

export const UpsertDeviceSchema = z.object({
  device_id: z.string().trim().min(1).max(128),
  user_id: z.string().uuid().nullable().optional(),
  expo_push_token: z
    .string()
    .trim()
    .regex(/^(ExponentPushToken|ExpoPushToken)\[[^\]]+\]$/)
    .nullable()
    .optional(),
  platform: z.enum(['ios', 'android']),
  app_version: z.string(),
  build_number: z.string().trim().max(50).optional(),
  location: DeviceLocationSchema.optional(),
});

export type DeviceIpGeoPayload = {
  country: string | null;
  countryCode: string | null;
  city: string | null;
  latitude: number | null;
  longitude: number | null;
};

export type DeviceTypePayload = {
  device_id: string;
  user_id?: string | null;
  expo_push_token?: string | null;
  platform: 'ios' | 'android';
  app_version: string;
  build_number?: string | null;
  location?: {
    latitude: number;
    longitude: number;
    accuracy_m?: number | null;
  };
  // Server-derived only — never accepted from client input (not part of UpsertDeviceSchema).
  ip_geo?: DeviceIpGeoPayload | null;
  ip?: string | null;
};

export class UpsertDeviceDto extends createZodDto(UpsertDeviceSchema) {}
