import { axiosInstance } from './client';

// ─── Types ────────────────────────────────────────────────────────────────

export interface SlackWorkspaceInfo {
  team_id?: string;
  team_name?: string;
  url?: string;
  enterprise_id?: string;
  enterprise_name?: string;
}

export interface SlackChannel {
  id: string;
  external_id: string;
  name: string;
  is_private: boolean;
  is_archived: boolean;
  purpose: string;
  topic: string;
  synced_at?: string;
}

export interface SlackMessage {
  id: string;
  external_id: string;
  channel_id: string;
  channel_name: string;
  user_id: string;
  text: string;
  ts: string;
  thread_ts: string;
  reactions?: unknown[];
  bot_name: string;
  type: string;
  synced_at?: string;
}

export interface SlackAnalytics {
  channel_count: number;
  public_count: number;
  private_count: number;
  last_sync_at?: string;
  message_count_24h?: number;
  message_count_7d?: number;
  message_count_30d?: number;
}

export interface SlackSyncResult {
  message: string;
  status: string;
}

// ─── API ──────────────────────────────────────────────────────────────────

const baseUrl = (companyId: string) => `/api/company/${companyId}/slack`;

export const slackApi = {
  // Workspace
  async getWorkspace(
    companyId: string
  ): Promise<{
    success: boolean;
    data: {
      workspace: SlackWorkspaceInfo;
      channel_count: number;
      public_count: number;
      private_count: number;
      last_sync_at?: string;
    };
  }> {
    const response = await axiosInstance.get(`${baseUrl(companyId)}/workspace`);
    return response.data;
  },

  // Channels
  async getChannels(
    companyId: string,
    params?: { search?: string; is_private?: string; is_archived?: string }
  ): Promise<{
    success: boolean;
    data: { items: SlackChannel[]; total: number };
  }> {
    const response = await axiosInstance.get(`${baseUrl(companyId)}/channels`, { params });
    return response.data;
  },

  // Messages
  async getMessages(
    companyId: string,
    params?: { channel_id?: string; search?: string; limit?: number }
  ): Promise<{
    success: boolean;
    data: { items: SlackMessage[]; total: number };
  }> {
    const response = await axiosInstance.get(`${baseUrl(companyId)}/messages`, { params });
    return response.data;
  },

  // Sync
  async sync(companyId: string): Promise<{ success: boolean; data: SlackSyncResult }> {
    const response = await axiosInstance.post(`${baseUrl(companyId)}/sync`);
    return response.data;
  },

  // Send message
  async sendMessage(
    companyId: string,
    data: { channel_id: string; text: string; thread_ts?: string }
  ): Promise<{
    success: boolean;
    data: { status: string; channel: string; ts?: string };
  }> {
    const response = await axiosInstance.post(`${baseUrl(companyId)}/send-message`, data);
    return response.data;
  },
};