export interface AdminUserSummary {
  id: number;
  email: string;
  name: string;
  role: "admin" | "user";
  status: "active" | "blocked" | "pending_deletion";
  email_verified: boolean;
  access_type: "google" | "password" | "mixed";
  avatar_url: string | null;
  created_at: string;
  product_count: number;
  expiring_count: number;
  expired_count: number;
  last_product_at: string | null;
}

export interface AdminPlatformSummary {
  total_users: number;
  admin_users: number;
  regular_users: number;
  blocked_users: number;
  total_products: number;
  products_expiring_soon: number;
  expired_products: number;
  users_with_products: number;
  recent_users: AdminUserSummary[];
}

export interface PaginatedResult<T> {
  items: T[];
  total: number;
  page: number;
  pageSize: number;
  totalPages: number;
}

export interface AdminAuditEntry {
  id: number;
  actor_user_id: number | null;
  actor_name: string | null;
  actor_email: string | null;
  target_user_id: number | null;
  target_name: string | null;
  target_email: string | null;
  action: string;
  details: Record<string, unknown>;
  created_at: string;
}

export interface AdminSystemHealth {
  api: {
    status: "ok";
    nodeEnv: string;
    uptimeSeconds: number;
    version: string;
  };
  database: {
    status: "ok" | "error";
    migrations: number;
  };
  storage: {
    status: "ok" | "error";
    root: string;
    receiptsPath: string;
    receiptFiles: number;
  };
  security: {
    jwtSecretConfigured: boolean;
    jwtSecretLooksDefault: boolean;
    googleOAuthConfigured: boolean;
    smtpConfigured: boolean;
    smtpAuthenticated: boolean;
    smtpLastError: string | null;
    smtpLastErrorAt: string | null;
  };
  maintenance: {
    pendingPurgeUsers: number;
    expiredEmailVerificationTokens: number;
    expiredPasswordResetTokens: number;
    expiredAccountDeletionTokens: number;
    expiredAppLogs: number;
    expiredAdminAuditEntries: number;
    warrantyReminderCandidates: number;
    failedEmailOutbox: number;
    pendingEmailOutbox: number;
    pushSubscriptions: number;
    pushDeliveryFailures: number;
    appLogRetentionDays: number;
    adminAuditRetentionDays: number;
    warrantyReminderDays: number[];
    notificationEmailBatchLimit: number;
  };
}

export interface AdminMaintenanceRunSummary {
  pendingPurgeUsers: number;
  expiredEmailVerificationTokens: number;
  expiredPasswordResetTokens: number;
  expiredAccountDeletionTokens: number;
  expiredAppLogs: number;
  expiredAdminAuditEntries: number;
  warrantyReminderCandidates: number;
  failedEmailOutbox: number;
  pendingEmailOutbox: number;
  purgedUsers: number;
  cleanedEmailVerificationTokens: number;
  cleanedPasswordResetTokens: number;
  cleanedAccountDeletionTokens: number;
  cleanedAppLogs: number;
  cleanedAdminAuditEntries: number;
  warrantyReminderSent: number;
  warrantyReminderCreatedOutbox: number;
  warrantyReminderPushSent: number;
  warrantyReminderPushFailed: number;
  warrantyReminderPushSkipped: number;
  warrantyReminderPushExpired: number;
  cleanedReceiptFiles: number;
  cleanedProductMediaFiles: number;
  cleanedIncidentAttachmentFiles: number;
}

export interface AdminAppLogEntry {
  id: number;
  level: "info" | "warning" | "error";
  source: string;
  message: string;
  details: Record<string, unknown>;
  created_at: string;
}

export interface AdminEmailOutboxEntry {
  id: number;
  user_id: number | null;
  recipient: string;
  subject: string;
  body: string;
  status: "pending" | "sent" | "failed";
  created_at: string;
  sent_at: string | null;
}

export interface AdminSecurityIncidentEntry {
  id: number;
  severity: "low" | "medium" | "high" | "critical";
  title: string;
  status: "open" | "investigating" | "contained" | "resolved" | "closed";
  detected_at: string;
  resolved_at: string | null;
  reported_by: string;
  summary: string;
  response: string;
  created_at: string;
  updated_at: string;
}

export interface AdminPublicReviewEntry {
  id: number;
  user_id: number;
  user_name: string;
  user_email: string;
  incident_number: string;
  title: string;
  store_label: string;
  brand_label: string;
  product_name: string;
  rating: number;
  notes: string;
  share_public_rating: boolean;
  updated_at: string;
}

export interface AdminIncidentEntry {
  id: number;
  incident_number: string;
  title: string;
  status: "open" | "sent" | "received" | "diagnosing" | "awaiting_parts" | "repaired" | "replaced" | "rejected" | "closed";
  incident_type: string;
  user_id: number;
  user_name: string;
  user_email: string;
  product_name: string;
  product_brand: string;
  product_model: string;
  user_rating: number | null;
  share_public_rating: boolean;
  attachment_count: number;
  media_count: number;
  updated_at: string;
}

export interface AdminIncidentDetail extends AdminIncidentEntry {
  product_id: number;
  product_status: string;
  product_days_remaining: number;
  description: string;
  symptom: string;
  accessories: string;
  sat_name: string;
  sat_reference: string;
  diagnosis: string;
  technician_notes: string;
  estimated_cost: string | null;
  resolution: string;
  replaced_with_new: boolean;
  replaced_with_refurbished: boolean;
  closed_at: string | null;
  created_at: string;
  attachments: Array<{
    id: number;
    file_url: string;
    file_name: string;
    mime_type: string;
    caption: string;
    sort_order: number;
    created_at: string;
  }>;
  media: Array<{
    id: number;
    file_url: string;
    file_name: string;
    mime_type: string;
    caption: string;
    sort_order: number;
    created_at: string;
  }>;
}

export interface AdminBackupExecutionEntry {
  id: number;
  scope: "manual" | "scheduled" | "pre_deploy" | "restore_test";
  status: "running" | "success" | "failed";
  target: string;
  started_at: string;
  finished_at: string | null;
  operator: string;
  details: Record<string, unknown>;
  created_at: string;
  updated_at: string;
}

export interface AdminUserDetail extends AdminUserSummary {
  active_count: number;
  recent_products: Array<{
    id: number;
    name: string;
    brand: string;
    category: string;
    warranty_end_date: string;
    created_at: string;
  }>;
}

export type CanonicalCatalogKind = "store" | "brand" | "product";
export type CanonicalCatalogStatus = "seeded" | "verified" | "pending" | "rejected";

export interface CanonicalCatalogEntry {
  id: number;
  kind: CanonicalCatalogKind;
  canonical_name: string;
  display_name: string;
  normalized_name: string;
  status: CanonicalCatalogStatus;
  metadata: Record<string, unknown>;
  source_label: string;
  source_url: string;
  alias_count: number;
  observed_count: number;
  created_at: string;
  updated_at: string;
}

export interface CatalogObservation {
  raw_value: string;
  normalized_value: string;
  observed_count: number;
  matched_entry_id: number | null;
  matched_display_name: string | null;
}

export interface AdminCatalogSummary {
  entries: CanonicalCatalogEntry[];
  observations: CatalogObservation[];
}

export interface CatalogSuggestion {
  raw_value: string;
  normalized_value: string;
  observed_count: number;
  suggested_action: "alias" | "create";
  suggested_entry_id: number | null;
  suggested_display_name: string | null;
  suggested_canonical_name: string | null;
  similarity: number;
  reason: string;
}
