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 DeviceSchema = z.object({
  device_id: z.string().trim().min(1).max(128),
  expo_push_token: z
    .string()
    .trim()
    .regex(/^(ExponentPushToken|ExpoPushToken)\[[^\]]+\]$/)
    .nullable()
    .optional(),
  platform: z.enum(['ios', 'android']).optional(),
  app_version: z.string().optional(),
  location: DeviceLocationSchema.optional(),
});

export const CreateUserSchema = z.object({
  email: z.email().toLowerCase(),
  password: z.string().min(6),
  display_name: z.string().min(1),
  phone: z.string().nullable().optional(),
  consent_privacy: z.boolean(),
  consent_terms: z.boolean(),
  consent_ai: z.boolean(),
  consent_data_storage: z.boolean(),
  referral_code: z.string().nullable().optional(),
  device: DeviceSchema.optional(),
});

export const LoginSchema = z.object({
  email: z.email().toLowerCase(),
  password: z.string(),
  device: DeviceSchema.optional(),
});

export const RegisterDeviceSchema = z.object({
  device_id: z.string().trim().min(1).max(128),
  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 const LogoutDeviceSchema = z.object({
  device_id: z.string().trim().min(1).max(128),
});

export const ResetPasswordSchema = z
  .object({
    email: z.email().toLowerCase(),
    otp: z.string(),
    newPassword: z.string().min(6),
    confirmPassword: z.string(),
  })
  .refine((data) => data.newPassword === data.confirmPassword, {
    message: 'Passwords do not match',
    path: ['confirmPassword'],
  });

export const VerifyEmailSchema = z.object({
  otp: z.string().trim().regex(/^\d{6}$/, 'OTP must be 6 digits'),
});

export const SocialLoginSchema = z.object({
  provider: z.enum(['google', 'apple']),
  id_token: z.string().trim(),
  nonce: z.string().nullable().optional(),
  display_name: z.string().trim().nullable().optional(),
  phone: z.string().nullable().optional(),
  consent_privacy: z.boolean().optional(),
  consent_terms: z.boolean().optional(),
  consent_ai: z.boolean().optional(),
  consent_data_storage: z.boolean().optional(),
  referral_code: z.string().nullable().optional(),
  device: DeviceSchema.optional(),
});

export class CreateUserDto extends createZodDto(CreateUserSchema) {}
export class LoginDto extends createZodDto(LoginSchema) {}
export class RegisterDeviceDto extends createZodDto(RegisterDeviceSchema) {}
export class LogoutDeviceDto extends createZodDto(LogoutDeviceSchema) {}
export class ForgotPasswordDto extends createZodDto(LoginSchema.pick({ email: true })) {}
export class ResetPasswordDto extends createZodDto(ResetPasswordSchema) {}
export class VerifyEmailDto extends createZodDto(VerifyEmailSchema) {}
export class SocialLoginDto extends createZodDto(SocialLoginSchema) {}
