import { apiClient } from "./client";

// ─── /me ─────────────────────────────────────────────────────────────────────
export interface MeData {
  id: number;
  email: string;
  name: string;
  role: "admin" | "user";
  approval_status: "approved" | "pending" | "denied";
  calendar_sync_enabled: boolean;
}

export interface MeResponse {
  success: boolean;
  data: MeData;
}

// ─── Admin Users ──────────────────────────────────────────────────────────────
export interface AdminUser {
  id: number;
  email: string;
  name: string;
  role: "admin" | "user";
  approval_status: "approved" | "pending" | "denied";
  calendar_sync_enabled: boolean;
  approved_at: string | null;
  approved_by: number | null;
  denied_at: string | null;
}

export interface AdminUsersResponse {
  success: boolean;
  data: AdminUser[];
  meta?: {
    requested_by: number;
    approval_status: string | null;
  };
}

export interface UserDecisionResponse {
  success: boolean;
  message: string;
  data: {
    id: number;
    email: string;
    role: string;
    approval_status: string;
    approved_at: string | null;
    approved_by: number | null;
    denied_at: string | null;
  };
}

// ─── Admin Meetings ──────────────────────────────────────────────────────────
export interface AdminMeeting {
  meeting_id: number;
  title: string;
  meet_link: string;
  platform?: string;
  status: string;
  created_at: string;
  scheduled_at?: string | null;
  recall_join_at?: string | null;
  user_id?: number;
  user_email: string;
  user_name?: string;
  is_recurring?: boolean;
  is_guest?: boolean;
  recording_details?: {
    started_at?: string | null;
    stopped_at?: string | null;
    duration_seconds: number;
    duration_formatted: string;
  };
  participants_details?: {
    count: number;
    names: string[];
  };
}

export type AdminMeetingDetail = AdminMeeting & {
  meeting_uuid: string;
  bot_id: string;
  owner_name: string;
  owner_role: string;
  calendar_event_id: string;
  scheduled_start: string;
  scheduled_end: string;
  joined_at: string | null;
  ended_at: string | null;
  language: string;
  timezone: string;
  visibility: "private" | "organization" | "shared";
  recording_url: string;
  video_recording_url?: string;
  transcript_url: string;
  summary: {
    overview: string;
    decisions: string[];
    risks: string[];
    action_items: Array<{ task: string; owner: string; due: string; status: "open" | "in_progress" | "done" }>;
  };
  participants: Array<{
    name: string;
    email: string;
    role: "host" | "participant" | "external";
    join_time: string;
    leave_time: string;
    talk_time: string;
    sentiment: "positive" | "neutral" | "concerned";
  }>;
  transcript: Array<{ timestamp: string; speaker: string; text: string }>;
  analytics: {
    talk_ratio: Array<{ name: string; value: number }>;
    silence_seconds: number;
    interruptions: number;
    keywords: string[];
    ai_confidence: number;
  };
  processing: {
    recording: "ready" | "pending" | "failed";
    transcript: "ready" | "pending" | "failed";
    summary: "ready" | "pending" | "failed";
    webhooks: Array<{ event: string; status: "delivered" | "pending" | "failed"; time: string }>;
  };
  audit_log: Array<{ time: string; actor: string; event: string; ip: string }>;
};

export interface AdminMeetingsParams {
  page?: number;
  limit?: number;
  status?: string;
  search?: string;
  platform?: string;
  type?: string;
  time?: string;
  sort_by?: string;
}

export interface AdminMeetingsResponse {
  success: boolean;
  pagination: {
    page: number;
    limit: number;
    total: number;
    total_pages: number;
    has_next: boolean;
    next_page: number | null;
  };
  data: AdminMeeting[];
}

// ─── Admin Dashboard Stats ───────────────────────────────────────────────────
export interface RecordingStatistics {
  recorded_meetings_count: number;
  total_recorded_duration_seconds: number;
  total_recorded_duration_formatted: string;
  average_duration_seconds: number;
  average_duration_formatted: string;
}

export interface PlatformStatistics {
  platforms: {
    google_meet?: number;
    microsoft_teams?: number;
    zoom?: number;
    jitsi?: number;
    [key: string]: number | undefined;
  };
}

export interface AdminDashboardData {
  total_users: number;
  approved_users: number;
  pending_approval: number;
  total_meetings: number;
  completed_meetings: number;
  active_now: number;
  platform_statistics?: PlatformStatistics;
  recording_statistics: RecordingStatistics;
}

export interface AdminDashboardResponse {
  success: boolean;
  data: AdminDashboardData;
}

export interface RecordingUsageItem {
  label: string;
  period_start: string;
  duration_seconds: number;
  duration_hours: number;
}

export interface RecordingUsageData {
  frequency: "daily" | "weekly" | "monthly" | "yearly";
  total_duration_seconds: number;
  total_duration_hours: number;
  data: RecordingUsageItem[];
}

export interface AdminRecordingUsageResponse {
  success: boolean;
  data: RecordingUsageData;
}

// ─── API calls ────────────────────────────────────────────────────────────────
export function getMe(): Promise<MeResponse> {
  return apiClient.get<MeResponse>("/me");
}

export function getAdminUsers(params?: { approval_status?: string }): Promise<AdminUsersResponse> {
  const queryParams: Record<string, string> = {};
  if (params?.approval_status) queryParams.approval_status = params.approval_status;
  return apiClient.get<AdminUsersResponse>("/admin/users", { params: queryParams });
}

export function userDecision(userId: number, action: "approve" | "deny"): Promise<UserDecisionResponse> {
  return apiClient.post<UserDecisionResponse>(`/admin/users/${userId}/decision`, { action }, { toast: false });
}

export function getAdminDashboard(): Promise<AdminDashboardResponse> {
  return apiClient.get<AdminDashboardResponse>("/admin/dashboard");
}

export function getAdminMeetings(params?: AdminMeetingsParams): Promise<AdminMeetingsResponse> {
  const queryParams: Record<string, string> = {};
  if (params?.page !== undefined) queryParams.page = String(params.page);
  if (params?.limit !== undefined) queryParams.limit = String(params.limit);
  if (params?.status && params.status !== "all") {
    queryParams.status = params.status;
  }
  if (params?.search !== undefined && params.search !== "") {
    queryParams.search = params.search;
  }
  if (params?.platform !== undefined && params.platform !== "all") {
    queryParams.platform = params.platform;
  }
  if (params?.type !== undefined && params.type !== "all") {
    queryParams.type = params.type;
  }
  if (params?.time !== undefined && params.time !== "all") {
    queryParams.time = params.time;
  }
  if (params?.sort_by !== undefined && params.sort_by !== "all") {
    queryParams.sort_by = params.sort_by;
  }
  return apiClient.get<AdminMeetingsResponse>("/admin/meetings", { params: queryParams });
}

export interface AdminMeetingDetailApiResponse {
  success: boolean;
  data: {
    meeting: {
      id: number;
      title: string;
      status: string;
      platform: string;
      duration_seconds: number;
      duration_formatted: string;
      participants_count: number;
      is_guest?: boolean;
    };
    metadata: {
      owner: {
        id: number;
        name: string;
        email: string;
      };
      user_id: number;
      created_at: string;
      scheduled_at: string;
      bot_id: string;
      calendar_event_id: string;
      bot_status: string;
      bot_sub_code: string | null;
      is_guest?: boolean;
    };
    assets: {
      meet_link: string;
      audio_recording_url?: string | null;
      video_recording_url?: string | null;
      transcript?: {
        id: number;
        recall_transcript_id: string;
        status: string;
        language: string | null;
        duration_seconds: number;
        download_url: string;
        provider_data_download_url: string;
        full_text: string;
        participants: string[];
        speaker_map: Record<string, string>;
        segments: Array<{
          index: number;
          speaker: string;
          text: string;
          start: number;
          end: number;
        }>;
        created_at: string;
        completed_at: string | null;
      } | null;
    };
    recording?: {
      id: number;
      status: string;
      recall_recording_id: string;
      started_at: string;
      stopped_at: string;
      duration_seconds: number;
      transcript_download_url: string;
      transcript_provider_data_download_url: string;
      participant_events_download_url: string;
      speaker_timeline_download_url: string;
      participants_download_url: string;
    } | null;
    webhook_events: Array<{
      id: number;
      webhook_id: string;
      event: string;
      bot_id: string;
      recording_id: string | null;
      transcript_id: string | null;
      status_code: string;
      status_sub_code: string | null;
      processed_at: string;
      processing_error: string | null;
      created_at: string;
    }>;
  };
}

export function getAdminMeetingDetail(meetingId: number | string): Promise<AdminMeetingDetailApiResponse> {
  return apiClient.get<AdminMeetingDetailApiResponse>(`/admin/meetings/${meetingId}`);
}

export function getAdminRecordingUsage(frequency: string): Promise<AdminRecordingUsageResponse> {
  return apiClient.get<AdminRecordingUsageResponse>("/admin/recording-usage", {
    params: { frequency },
  });
}


