import { z } from 'zod';
import { createZodDto } from 'nestjs-zod';
import { type Kysely } from 'kysely';
import { DB } from '@/database/database.type';

export const UpdatePushTokenSchema = z.object({
  token: z
    .string()
    .trim()
    .regex(/^(ExponentPushToken|ExpoPushToken)\[[^\]]+\]$/, {
      error: 'Invalid push token format',
    }),
});

export const BlockUserSchema = z.object({
  blockedUserId: z.string().min(1),
});

export const ReportContentSchema = z.object({
  targetType: z.enum(['user', 'report', 'comment', 'story', 'quick_snap']),
  targetId: z.uuid(),
  reason: z.string().min(1),
  description: z.string().nullable().optional(),
});

export const DeductCreditsSchema = z.object({
  creditsToUse: z.number().int().min(1).default(1),
});

export interface GrantCreditsPurchaseInput {
  user_id: string;
  productId: string;
  platform: 'ios' | 'android';
  credits: number;
  priceUsd?: number;
  currency?: string;
  transactionId?: string;
  originalTransactionId?: string;
  purchaseToken?: string;
  storePayload?: Record<string, unknown>;
  client?: Kysely<DB>;
}

export interface DeductCreditsInput {
  user_id: string;
  creditsToUse?: number;
  client?: Kysely<DB>;
}

export class UpdatePushTokenDto extends createZodDto(UpdatePushTokenSchema) {}
export class BlockUserDto extends createZodDto(BlockUserSchema) {}
export class ReportContentDto extends createZodDto(ReportContentSchema) {}
export class DeductCreditsDto extends createZodDto(DeductCreditsSchema) {}
