import { z } from 'zod';

/**
 * Validation schemas for data export
 */

/**
 * User statistics schema
 */
export const userStatisticsSchema = z.object({
  ride_count: z.number().int().min(0),
  coaster_count: z.number().int().min(0),
  park_count: z.number().int().min(0),
  review_count: z.number().int().min(0),
  reputation_score: z.number().int().min(0),
  photo_count: z.number().int().min(0),
  list_count: z.number().int().min(0),
  submission_count: z.number().int().min(0),
  account_created: z.string(),
  last_updated: z.string()
});

/**
 * Activity log entry schema
 */
export const activityLogEntrySchema = z.object({
  id: z.string().uuid(),
  action: z.string(),
  changes: z.record(z.string(), z.any()),
  created_at: z.string(),
  changed_by: z.string().uuid(),
  ip_address_hash: z.string().optional(),
  user_agent: z.string().optional()
});

/**
 * Export options schema
 */
export const exportOptionsSchema = z.object({
  include_reviews: z.boolean(),
  include_lists: z.boolean(),
  include_activity_log: z.boolean(),
  include_preferences: z.boolean(),
  format: z.literal('json')
});

/**
 * Export profile data schema
 */
export const exportProfileDataSchema = z.object({
  username: z.string(),
  display_name: z.string().nullable(),
  bio: z.string().nullable(),
  preferred_pronouns: z.string().nullable(),
  personal_location: z.string().nullable(),
  timezone: z.string(),
  preferred_language: z.string(),
  theme_preference: z.string(),
  privacy_level: z.string(),
  created_at: z.string(),
  updated_at: z.string()
});

/**
 * Export review data schema
 */
export const exportReviewDataSchema = z.object({
  id: z.string().uuid(),
  rating: z.number().min(1).max(5),
  review_text: z.string().nullable(),
  ride_name: z.string().optional(),
  park_name: z.string().optional(),
  created_at: z.string()
});

/**
 * Export list data schema
 */
export const exportListDataSchema = z.object({
  id: z.string().uuid(),
  name: z.string(),
  description: z.string().nullable(),
  is_public: z.boolean(),
  item_count: z.number().int().min(0),
  created_at: z.string()
});

/**
 * Complete export data structure schema
 */
export const exportDataSchema = z.object({
  export_date: z.string(),
  user_id: z.string().uuid(),
  profile: exportProfileDataSchema,
  statistics: userStatisticsSchema,
  reviews: z.array(exportReviewDataSchema),
  lists: z.array(exportListDataSchema),
  activity_log: z.array(activityLogEntrySchema),
  preferences: z.object({
    unit_preferences: z.any(),
    accessibility_options: z.any(),
    notification_preferences: z.any(),
    privacy_settings: z.any()
  }),
  metadata: z.object({
    export_version: z.string(),
    data_retention_info: z.string(),
    instructions: z.string()
  })
});

/**
 * Default export options
 */
export const DEFAULT_EXPORT_OPTIONS = {
  include_reviews: true,
  include_lists: true,
  include_activity_log: true,
  include_preferences: true,
  format: 'json' as const
};
