import type { PaginatedResponse } from '@/types';

// ---------------------------------------------------------------------------
// Shared / Reusable
// ---------------------------------------------------------------------------

/** Common chart data point: date + count */
export interface ChartDataPoint {
  date: string;
  count: number;
}

/** Shared filter state for sortable/searchable tables */
export interface SortableFilters {
  [key: string]: string | number | boolean | undefined;
  search?: string;
  sort?: string;
  dir?: string;
}

// ---------------------------------------------------------------------------
// Audit Logs
// ---------------------------------------------------------------------------

/** Minimal audit log used in recent-activity tables */
export interface AuditLogSummary {
  id: number;
  event: string;
  user_id: number | null;
  user_name: string | null;
  user_email?: string | null;
  ip?: string | null;
  created_at: string;
}

/** Audit log entry used in user-detail / billing-detail contexts */
export interface AuditLogEntry {
  id: number;
  event: string;
  ip: string | null;
  created_at: string;
  metadata: Record<string, unknown> | null;
}

/** Full audit log row used in audit log list page */
export interface AuditLogRow {
  id: number;
  event: string;
  user_name: string | null;
  user_email: string | null;
  user_id: number | null;
  ip: string | null;
  user_agent: string | null;
  metadata: Record<string, unknown> | null;
  created_at: string;
}

/** Single audit log detail */
export interface AuditLogDetail {
  id: number;
  event: string;
  user_id: number | null;
  user_name: string | null;
  user_email: string | null;
  ip: string | null;
  user_agent: string | null;
  metadata: Record<string, unknown> | null;
  created_at: string;
}

// ---------------------------------------------------------------------------
// Users
// ---------------------------------------------------------------------------

/** User row in admin user list */
export interface AdminUser {
  id: number;
  name: string;
  email: string;
  is_admin: boolean;
  admin_role?: string | null;
  email_verified_at: string | null;
  last_login_at: string | null;
  created_at: string;
  tokens_count: number;
  deleted_at: string | null;
  lead_score: number | null;
  lead_score_tier: 'cold' | 'warm' | 'hot' | 'pql' | null;
  pql_qualified_at: string | null;
}

/** Extended user detail for admin user show page */
export interface AdminUserDetail extends AdminUser {
  signup_source: string | null;
  has_password: boolean;
  two_factor_enabled: boolean;
  admin_role?: string | null;
}

/** Per-site usage data for admin user detail */
export interface AdminSiteUsage {
  id: number;
  name: string;
  domain: string;
  gsc_status: string | null;
  gsc_last_synced_at: string | null;
  wp_status: string | null;
  wp_last_synced_at: string | null;
  latest_analysis_status: string | null;
  latest_analysis_at: string | null;
  drafts_count: number;
  recommendations_count: number;
  applied_recommendations_count: number;
}

/** Aggregate usage totals for admin user detail */
export interface AdminSitesUsageTotals {
  sites: number;
  drafts: number;
  applied_recommendations: number;
}

/** Sites & Usage section data for admin user detail */
export interface AdminSitesUsage {
  totals: AdminSitesUsageTotals;
  sites: AdminSiteUsage[];
}

export interface AdminUserFilters extends SortableFilters {
  admin?: string;
  has_gsc?: string;
  has_wp?: string;
  has_applied_recs?: string;
  min_sites?: string;
  lead_tier?: string;
  per_page?: number;
}

// ---------------------------------------------------------------------------
// Billing
// ---------------------------------------------------------------------------

/** Dashboard-level billing stats */
export interface BillingDashboardStats {
  active_subscriptions: number;
  trialing: number;
  past_due: number;
  canceled: number;
  total_ever: number;
  mrr: number;
  churn_rate: number;
  trial_conversion_rate: number;
  ltv: number;
}

export interface BillingTrialStats {
  active_trials: number;
  expiring_soon: number;
}

export interface TierDistribution {
  tier: string;
  count: number;
}

export interface StatusBreakdown {
  status: string;
  count: number;
}

/** Billing event in recent events table */
export interface BillingEvent {
  id: number;
  event: string;
  user_id: number | null;
  user_name: string | null;
  metadata: Record<string, unknown> | null;
  created_at: string;
}

/** Subscription row in admin subscriptions list */
export interface SubscriptionRow {
  id: number;
  user_id: number;
  user_name: string;
  user_email: string;
  stripe_status: string;
  tier: string;
  quantity: number;
  trial_ends_at: string | null;
  ends_at: string | null;
  created_at: string;
}

/** Subscription detail for admin billing show page */
export interface SubscriptionDetail {
  id: number;
  user_name: string;
  user_email: string;
  user_id: number;
  stripe_id: string;
  stripe_status: string;
  tier: string;
  quantity: number;
  trial_ends_at: string | null;
  ends_at: string | null;
  created_at: string;
}

export interface SubscriptionItem {
  id: number;
  stripe_price: string;
  stripe_product: string;
  quantity: number;
  tier: string;
}

export interface SubscriptionFilters extends SortableFilters {
  status?: string;
  tier?: string;
}

/** User subscription as shown on user detail page */
export interface UserSubscription {
  stripe_status: string;
  stripe_price: string;
  quantity: number;
  trial_ends_at: string | null;
}

// ---------------------------------------------------------------------------
// Webhooks
// ---------------------------------------------------------------------------

export interface WebhookDashboardStats {
  total_endpoints: number;
  active_endpoints: number;
  total_deliveries: number;
  successful_deliveries: number;
  failed_deliveries: number;
  pending_deliveries: number;
  failure_rate: number;
  total_incoming: number;
  incoming_by_provider: Record<string, number>;
}

export interface WebhookDeliveryChartPoint {
  date: string;
  success: number;
  failed: number;
}

export interface WebhookFailure {
  id: number;
  event_type: string;
  endpoint_url: string;
  response_code: number | null;
  attempts: number;
  created_at: string;
}

// ---------------------------------------------------------------------------
// API Tokens
// ---------------------------------------------------------------------------

export interface TokenDashboardStats {
  total_tokens: number;
  users_with_tokens: number;
  recently_used: number;
  expired_tokens: number;
  never_used: number;
}

export interface ActiveToken {
  token_name: string;
  last_used_at: string;
  abilities: string[];
  user_id: number;
  user_name: string;
  user_email: string;
}

// ---------------------------------------------------------------------------
// Social Auth
// ---------------------------------------------------------------------------

export interface SocialAuthStats {
  total_linked: number;
  users_with_social: number;
  by_provider: Record<string, number>;
  expired_tokens: number;
}

export interface SocialLinkedAccountRow {
  user_id: number;
  user_name: string;
  user_email: string;
  provider: string;
  created_at: string;
}

// ---------------------------------------------------------------------------
// Two-Factor
// ---------------------------------------------------------------------------

export interface TwoFactorStats {
  total_users: number;
  two_factor_enabled: number;
  adoption_rate: number;
  without_two_factor: number;
}

export interface TwoFactorUserRow {
  user_id: number;
  user_name: string;
  user_email: string;
  enabled_at: string;
}

// ---------------------------------------------------------------------------
// Notifications
// ---------------------------------------------------------------------------

export interface NotificationStats {
  total_sent: number;
  unread: number;
  read: number;
  read_rate: number;
  sent_last_7d: number;
  by_type: Array<{ type: string; count: number }>;
}

export interface RecentNotificationRow {
  user_id: number;
  user_name: string;
  user_email: string;
  type: string;
  read_at: string | null;
  created_at: string;
}

// ---------------------------------------------------------------------------
// Health
// ---------------------------------------------------------------------------

export interface HealthCheck {
  status: string;
  message: string;
  response_time_ms: number;
}

export interface HealthStatus {
  status: 'healthy' | 'degraded' | 'unhealthy';
  checks: Record<string, HealthCheck>;
  timestamp: string;
}

// ---------------------------------------------------------------------------
// System
// ---------------------------------------------------------------------------

export interface FailedJob {
  uuid: string;
  connection: string;
  queue: string;
  job_name: string;
  exception: string;
  failed_at: string;
}

export interface SystemInfo {
  php_version: string;
  laravel_version: string;
  node_version: string | null;
  server: {
    os: string;
    server_software: string;
  };
  database: {
    driver: string;
    version: string | null;
  };
  queue: {
    driver: string;
    pending_jobs: number | null;
    failed_jobs: number | null;
  };
  packages: Array<{ name: string; version: string }>;
}

// ---------------------------------------------------------------------------
// Config
// ---------------------------------------------------------------------------

export interface FeatureFlag {
  key: string;
  enabled: boolean;
  env_var: string;
}

export interface ConfigWarning {
  level: 'critical' | 'warning';
  message: string;
}

export interface EnvironmentConfig {
  app_env: string;
  timezone: string;
}

// ---------------------------------------------------------------------------
// Activation Funnel
// ---------------------------------------------------------------------------

export interface ActivationFunnelStage {
  stage: string;
  count: number;
  conversion_rate: number;
}

// ---------------------------------------------------------------------------
// Dashboard (main admin overview)
// ---------------------------------------------------------------------------

export interface AdminDashboardStats {
  total_users: number;
  new_users_7d: number;
  new_users_30d: number;
  admin_count: number;
  active_subscriptions?: number;
  free_users?: number;
  trial_users?: number;
  paid_users?: number;
  trial_conversion_rate?: number;
}

// ---------------------------------------------------------------------------
// Page Props (one per admin page)
// ---------------------------------------------------------------------------

export interface OperationalHealth {
  queue_size: number;
  failed_jobs_1h: number;
  circuit_breakers: Record<string, string>;
  last_gsc_sync: string | null;
}

export interface AdminDashboardProps {
  stats: AdminDashboardStats;
  signup_chart: ChartDataPoint[];
  activation_funnel: {
    stages: Array<{ name: string; users: number; rate: number }>;
    activation_rate: number;
  };
  recent_activity: AuditLogSummary[];
  cancellation_reasons?: Array<{ reason: string | null; count: number }>;
  operational_health: OperationalHealth;
  last_refreshed_at: string;
}

export interface AdminUsersIndexProps {
  users: PaginatedResponse<AdminUser>;
  filters: AdminUserFilters;
}

export interface AdminUserBranding {
  company_name: string | null;
  logo_path: string | null;
  primary_color: string | null;
  secondary_color: string | null;
  remove_rankwiz_branding: boolean;
  custom_domain: string | null;
  is_domain_verified: boolean;
}

export interface AdminUsersShowProps {
  user: AdminUserDetail;
  recent_audit_logs: AuditLogEntry[];
  subscription: UserSubscription | null;
  sites_usage: AdminSitesUsage;
  limit_overrides: Record<string, number>;
  limit_defaults: Record<string, number>;
  branding: AdminUserBranding | null;
}

export interface ImpersonationSession {
  stopped_at: string;
  duration_seconds: number;
  stopped_log_id: number;
}

export interface AdminUserOption {
  id: number;
  name: string;
}

export interface AdminAuditLogsIndexProps {
  logs: PaginatedResponse<AuditLogRow>;
  eventTypes: string[];
  filters: {
    event?: string;
    user_id?: string;
    from?: string;
    to?: string;
    impersonation_only?: string;
    admin_actions_only?: string;
    operation?: string;
    mutations_only?: string;
    per_page?: number;
  };
  impersonation_count: number;
  adminUsers: AdminUserOption[];
}

export interface AdminAuditLogShowProps {
  auditLog: AuditLogDetail;
  impersonation_session: ImpersonationSession | null;
}

export interface TierUsageRow {
  tier: string;
  user_count: number;
  avg_sites: number;
  avg_analyses_30d: number;
  avg_drafts_30d: number;
  avg_applied_recommendations_30d: number;
  pct_gsc_connected: number;
  pct_wp_connected: number;
}

export interface ChurnBreakdown {
  voluntary: number;
  involuntary: number;
  unknown: number;
}

export interface CheckoutFunnel {
  checkout_started: number;
  checkout_completed: number;
  checkout_abandoned: number;
  conversion_rate: number;
}

export interface LtvByTierEntry {
  tier: string;
  arpu: number;
  ltv: number;
}

export interface AdminBillingDashboardProps {
  stats: BillingDashboardStats;
  tier_distribution: TierDistribution[];
  status_breakdown: StatusBreakdown[];
  growth_chart: ChartDataPoint[];
  trial_stats: BillingTrialStats;
  tier_usage: TierUsageRow[];
  churn_breakdown: ChurnBreakdown;
  checkout_funnel: CheckoutFunnel;
  ltv_by_tier: Record<string, LtvByTierEntry>;
  recent_events: BillingEvent[];
}

export interface AdminBillingSubscriptionsProps {
  subscriptions: PaginatedResponse<SubscriptionRow>;
  filters: SubscriptionFilters;
  statuses: string[];
  tiers: string[];
}

export interface AvailablePlan {
  label: string;
  value: string;
  tier: string;
}

export interface AdminBillingShowProps {
  subscription: SubscriptionDetail;
  items: SubscriptionItem[];
  audit_logs: AuditLogEntry[];
  available_plans: AvailablePlan[];
}

export interface AdminHealthProps {
  health: HealthStatus;
}

export interface AdminConfigProps {
  feature_flags: FeatureFlag[];
  warnings: ConfigWarning[];
  environment: EnvironmentConfig;
}

export interface AdminSystemProps {
  system: SystemInfo;
}

export interface AdminWebhooksDashboardProps {
  stats: WebhookDashboardStats;
  delivery_chart: WebhookDeliveryChartPoint[];
  recent_failures: WebhookFailure[];
}

export interface AdminTokensDashboardProps {
  stats: TokenDashboardStats;
  most_active: ActiveToken[];
}

export interface AdminSocialAuthDashboardProps {
  stats: SocialAuthStats;
  linked_accounts: SocialLinkedAccountRow[];
}

export interface AdminTwoFactorDashboardProps {
  stats: TwoFactorStats;
  users_with_2fa: TwoFactorUserRow[];
}

export interface AdminNotificationsDashboardProps {
  stats: NotificationStats;
  volume_chart: ChartDataPoint[];
  recent_notifications: RecentNotificationRow[];
}

// ---------------------------------------------------------------------------
// Sites
// ---------------------------------------------------------------------------

/** Site row in admin sites list */
export interface AdminSiteRow {
  id: number;
  name: string;
  domain: string;
  user_id: number;
  user_name: string;
  user_email: string;
  health_score: string | null;
  health_status: string;
  last_analysis_at: string | null;
  has_gsc: boolean;
  has_wp: boolean;
  created_at: string;
  deleted_at?: string | null;
}

export interface AdminSiteFilters extends SortableFilters {
  health?: string;
  has_gsc?: string;
  has_wp?: string;
  trashed?: string;
  per_page?: number;
}

export interface AdminSitesStats {
  total_sites: number;
  avg_health_score: number;
  both_connections_pct: number;
  critical_count: number;
}

export interface AdminSitesIndexProps {
  sites: PaginatedResponse<AdminSiteRow>;
  filters: AdminSiteFilters;
  stats: AdminSitesStats;
}

// ---------------------------------------------------------------------------
// Circuit Breaker
// ---------------------------------------------------------------------------

export interface CircuitBreakerState {
  state: 'closed' | 'open' | 'half_open';
  failure_count: number;
  failure_threshold: number;
  last_failure_at: string | null;
}

export interface AdminCircuitBreakerProps {
  circuits: Record<string, CircuitBreakerState>;
}

// ---------------------------------------------------------------------------
// Feature Flags
// ---------------------------------------------------------------------------

/** Feature flag summary for admin display */
export interface FeatureFlagAdmin {
  flag: string;
  env_default: boolean;
  global_override: boolean | null;
  effective: boolean;
  user_override_count: number;
  is_protected: boolean;
  is_route_dependent: boolean;
}

/** User override for a feature flag */
export interface FeatureFlagUserOverride {
  user_id: number;
  name: string;
  email: string;
  enabled: boolean;
}

/** User search result for targeting */
export interface FeatureFlagUserSearch {
  id: number;
  name: string;
  email: string;
}

export interface AdminFeatureFlagsIndexProps {
  flags: FeatureFlagAdmin[];
  filters?: {
    sort?: string;
    dir?: string;
  };
}

// ---------------------------------------------------------------------------
// Limit Policies
// ---------------------------------------------------------------------------

export interface AdminLimitPolicyRow {
  id: number;
  user_id: number;
  user_name: string;
  user_email: string;
  key: string;
  value: number;
  config_default: number;
  created_at: string;
}

export interface AdminLimitPolicyFilters extends SortableFilters {
  key?: string;
}

export interface AdminLimitPoliciesIndexProps {
  policies: PaginatedResponse<AdminLimitPolicyRow>;
  limit_keys: string[];
  filters: AdminLimitPolicyFilters;
}
