import axios from '@/network/axios';
import { useQuery } from '@tanstack/react-query';

export type PhoneReportRow = {
  platform: string;
  username: string;
  name: string | null;
  phone: string;
  country_code: string | null;
  source: 'admin_sheet' | 'merchant' | 'profile' | 'bio' | string;
  /** From influencers.subscribers_count; null when the influencer isn't synced. */
  followers: number | null;
};

export type PhoneReportMeta = {
  total: number;
  current_page: number;
  per_page: number;
  last_page: number;
};

export type PhoneReportResponse = {
  status: boolean;
  message: string;
  data: {
    items: PhoneReportRow[];
    meta: PhoneReportMeta;
  };
};

export type PhoneReportFilters = {
  page?: number;
  per_page?: number;
  search?: string;
  platform?: string;
  source?: string;
  country_code?: string;
  min_followers?: string;
  max_followers?: string;
};

/** Stable key identifying a row for selection: "platform|handle" (lowercased). */
export const rowKey = (r: PhoneReportRow) =>
  `${(r.platform || '').toLowerCase()}|${(r.username || '').replace(/^@/, '').toLowerCase()}`;

export const buildParams = (filters: PhoneReportFilters = {}) => {
  const params: Record<string, string | number> = {};
  if (filters.page && filters.page > 0) params.page = filters.page;
  if (filters.per_page) params.per_page = filters.per_page;
  if (filters.search?.trim()) params.search = filters.search.trim();
  if (filters.platform?.trim()) params.platform = filters.platform.trim();
  if (filters.source?.trim()) params.source = filters.source.trim();
  if (filters.country_code?.trim()) params.country_code = filters.country_code.trim();
  if (filters.min_followers?.trim()) params.min_followers = filters.min_followers.trim();
  if (filters.max_followers?.trim()) params.max_followers = filters.max_followers.trim();
  return params;
};

const getReport = async (filters: PhoneReportFilters = {}): Promise<PhoneReportResponse> => {
  const { data } = await axios.get<PhoneReportResponse>('/influencer-number/report', {
    params: buildParams(filters),
  });
  return data;
};

const useInfluencerPhoneReport = (filters: PhoneReportFilters = {}) => {
  const {
    page = 1,
    search = '',
    platform = '',
    source = '',
    country_code = '',
    min_followers = '',
    max_followers = '',
  } = filters;
  return useQuery<PhoneReportResponse>({
    queryKey: [
      'influencer-phone-report',
      page,
      search,
      platform,
      source,
      country_code,
      min_followers,
      max_followers,
    ],
    queryFn: () =>
      getReport({ page, search, platform, source, country_code, min_followers, max_followers }),
  });
};

export default useInfluencerPhoneReport;
