import { api } from '@/lib/api';
import type { CheckinMode } from '@/features/meeting-attendance/constants/checkin-mode';

const BASE_URL = '/meeting-attendance';
const apiGet = <T = any>(url: string, config?: Record<string, any>) =>
  api.get(url, config) as Promise<T>;
const apiPost = <T = any>(url: string, payload?: Record<string, any>, config?: Record<string, any>) =>
  api.post(url, payload, config) as Promise<T>;
const apiPut = <T = any>(url: string, payload?: Record<string, any>, config?: Record<string, any>) =>
  api.put(url, payload, config) as Promise<T>;
const apiPatch = <T = any>(url: string, payload?: Record<string, any>, config?: Record<string, any>) =>
  api.patch(url, payload, config) as Promise<T>;
const apiDelete = <T = any>(url: string, config?: Record<string, any>) =>
  api.delete(url, config) as Promise<T>;

export interface Pagination {
  page: number;
  limit: number;
  total: number;
  totalPages: number;
}

export interface MeetingListQuery {
  page?: number;
  limit?: number;
  status?: string;
  anchor?: string;
}

export const meetingAttendanceApi = {
  listMeetings: (params: MeetingListQuery) => apiGet(`${BASE_URL}/meetings`, { params }),
  getMeeting: (id: string) => apiGet(`${BASE_URL}/meetings/${id}`),
  getPublicMeeting: (id: string) => apiGet(`${BASE_URL}/meetings/${id}/public`),
  createMeeting: (payload: Record<string, any>) => apiPost(`${BASE_URL}/meetings`, payload),
  updateMeeting: (id: string, payload: Record<string, any>) => apiPut(`${BASE_URL}/meetings/${id}`, payload),
  deleteMeeting: (id: string) => apiDelete(`${BASE_URL}/meetings/${id}`),
  listSeries: () => apiGet(`${BASE_URL}/series`),
  getSeries: (id: string) => apiGet(`${BASE_URL}/series/${id}`),
  createSeries: (payload: Record<string, any>) => apiPost(`${BASE_URL}/series`, payload),
  updateSeries: (id: string, payload: Record<string, any>) => apiPut(`${BASE_URL}/series/${id}`, payload),
  deleteSeries: (id: string) => apiDelete(`${BASE_URL}/series/${id}`),
  getSeriesHistory: (id: string) => apiGet(`${BASE_URL}/series/${id}/history`),
  updateSeriesSchedule: (id: string, payload: Record<string, any>) =>
    apiPost(`${BASE_URL}/series/${id}/update-schedule`, payload),
  getSeriesAttendees: (id: string) => apiGet(`${BASE_URL}/series/${id}/attendees`),
  setSeriesAttendees: (id: string, payload: Record<string, any>) =>
    apiPost(`${BASE_URL}/series/${id}/attendees`, payload),
  updateSeriesAttendeeRole: (id: string, payload: Record<string, any>) =>
    apiPatch(`${BASE_URL}/series/${id}/attendees`, payload),
  deleteSeriesAttendee: (id: string, payload: Record<string, any>) =>
    apiDelete(`${BASE_URL}/series/${id}/attendees`, { data: payload }),
  updateSeriesMeeting: (id: string, meetingId: string, payload: Record<string, any>) =>
    apiPut(`${BASE_URL}/series/${id}/meetings/${meetingId}`, payload),
  cancelSeriesMeeting: (id: string, meetingId: string) =>
    apiDelete(`${BASE_URL}/series/${id}/meetings/${meetingId}`),
  listTemplates: () => apiGet(`${BASE_URL}/templates`),
  createTemplate: (payload: Record<string, any>) => apiPost(`${BASE_URL}/templates`, payload),
  updateTemplate: (id: string, payload: Record<string, any>) => apiPut(`${BASE_URL}/templates/${id}`, payload),
  deleteTemplate: (id: string) => apiDelete(`${BASE_URL}/templates/${id}`),
  createMeetingFromTemplate: (id: string, payload: Record<string, any>) =>
    apiPost(`${BASE_URL}/templates/${id}/create-meeting`, payload),
  resetMeetingUserPassword: (id: string, payload: Record<string, any>) =>
    apiPost(`${BASE_URL}/users/${id}/reset-password`, payload),
  listUsers: (params: Record<string, any>) => apiGet(`${BASE_URL}/users`, { params }),
  createUser: (payload: Record<string, any>) => apiPost(`${BASE_URL}/users`, payload),
  updateUser: (id: string, payload: Record<string, any>) => apiPut(`${BASE_URL}/users/${id}`, payload),
  disableUser: (id: string) => apiDelete(`${BASE_URL}/users/${id}`),
  deleteUserPermanent: (id: string, force = false) =>
    apiDelete(`${BASE_URL}/users/${id}/permanent`, { params: { force } }),
  importUsers: (payload: Record<string, any>) => apiPost(`${BASE_URL}/users/import`, payload),
  downloadUserImportTemplate: () =>
    apiGet(`${BASE_URL}/users/import`, { responseType: 'blob' }),
  listAuditLogs: (params: Record<string, any>) => apiGet(`${BASE_URL}/audit-logs`, { params }),
  getAuditLogStats: (params: Record<string, any>) => apiGet(`${BASE_URL}/audit-logs/stats`, { params }),
  getAttendanceReport: () => apiGet(`${BASE_URL}/reports/attendance`),
  getSeriesReport: (params: {
    seriesId: string;
    startDate?: string;
    endDate?: string;
    includeLegacy?: boolean;
  }) => {
    const queryParams: Record<string, any> = {
      seriesId: params.seriesId,
      ...(params.startDate ? { startDate: params.startDate } : {}),
      ...(params.endDate ? { endDate: params.endDate } : {}),
      ...(params.includeLegacy === false ? { includeLegacy: '0' } : {}),
    };
    return apiGet(`${BASE_URL}/reports/series`, { params: queryParams });
  },
  listSeriesOptions: () => apiGet(`${BASE_URL}/reports/series-options`),
  getSingleMeetingReport: (params: { meetingId: string }) =>
    apiGet(`${BASE_URL}/reports/single-meeting`, { params }),
  listRequiredAttendees: (id: string) => apiGet(`${BASE_URL}/meetings/${id}/required-attendees`),
  addRequiredAttendees: (id: string, payload: Record<string, any>) =>
    apiPost(`${BASE_URL}/meetings/${id}/required-attendees`, payload),
  removeRequiredAttendee: (id: string, userId: string) =>
    apiDelete(`${BASE_URL}/meetings/${id}/required-attendees/${encodeURIComponent(userId)}`),
  importAttendees: (id: string, attendees: any[]) =>
    apiPost(`${BASE_URL}/meetings/${id}/import-attendees`, { attendees }),
  markAbsent: (id: string) => apiPost(`${BASE_URL}/meetings/${id}/mark-absent`),
  searchAttendees: (id: string, params: Record<string, any>) =>
    apiGet(`${BASE_URL}/meetings/${id}/attendees/search`, { params }),
  updateAttendanceStatus: (meetingId: string, userId: string, payload: Record<string, any>) =>
    apiPatch(`${BASE_URL}/meetings/${meetingId}/attendance/${userId}`, payload),
  checkin: (id: string, payload: Record<string, any>) =>
    apiPost(`${BASE_URL}/meetings/${id}/checkin`, payload),
  guestCheckin: (id: string, payload: Record<string, any>) =>
    apiPost(`${BASE_URL}/meetings/${id}/guest-checkin`, payload),
  searchMeetingUsers: (params: { q: string; limit?: number }) =>
    apiGet(`${BASE_URL}/users/search`, { params }),
  listOutlookCandidates: (params?: Record<string, any>, config?: Record<string, any>) =>
    apiGet(`${BASE_URL}/integrations/outlook/candidates`, { params, ...(config || {}) }),
  listOutlookCandidateSeriesChildren: (
    seriesMasterId: string,
    params?: { mailboxId?: string; includeCancelled?: boolean; includePast?: boolean },
  ) =>
    apiGet(`${BASE_URL}/integrations/outlook/candidates/${seriesMasterId}/children`, { params }),
  manageOutlookBinding: (payload: {
    mailboxId: string;
    graphEventId: string;
    iCalUId: string;
    action: 'MANAGE';
  }) => apiPost(`${BASE_URL}/integrations/outlook/bindings`, payload),
  listOutlookBindingExclusions: (id: string, params?: { page?: number; pageSize?: number }) =>
    apiGet(`${BASE_URL}/integrations/outlook/bindings/${id}/exclusions`, { params }),
  excludeOutlookSeriesOccurrence: (id: string, payload: {
    occurrenceGraphEventId: string;
    iCalUId?: string;
    reason?: string;
  }) => apiPost(`${BASE_URL}/integrations/outlook/bindings/${id}/exclusions`, payload),
  removeOutlookSeriesOccurrenceExclusion: (id: string) =>
    apiPost(`${BASE_URL}/integrations/outlook/exclusions/${id}/remove`, {}),
  takeoverOutlookBinding: (id: string, payload?: { mailboxId?: string }) =>
    apiPost(`${BASE_URL}/integrations/outlook/bindings/${id}/takeover`, payload || {}),
  unmanageOutlookBinding: (id: string) =>
    apiPost(`${BASE_URL}/integrations/outlook/bindings/${id}/unmanage`, {}),
  resumeOutlookBindingSync: (id: string) =>
    apiPost(`${BASE_URL}/integrations/outlook/bindings/${id}/resume-sync`, {}),
  getOutlookBindingDetail: (id: string) =>
    apiGet(`${BASE_URL}/integrations/outlook/bindings/${id}`),
  listOutlookBindingHistory: (id: string, params?: {
    page?: number;
    pageSize?: number;
    startDate?: string;
    endDate?: string;
    eventType?: string;
    stage?: string;
    onlyError?: boolean;
  }) =>
    apiGet(`${BASE_URL}/integrations/outlook/bindings/${id}/history`, { params }),
  exportOutlookBindingHistoryCsv: (id: string, params?: {
    startDate?: string;
    endDate?: string;
    eventType?: string;
    stage?: string;
    onlyError?: boolean;
  }) =>
    apiGet(`${BASE_URL}/integrations/outlook/bindings/${id}/history/export.csv`, {
      params,
      responseType: 'blob',
    }),
  listManagedOutlookBindings: (params: {
    mailboxId: string;
    keyword?: string;
    eventType?: string;
    status?: string;
    page?: number;
    pageSize?: number;
  }, config?: Record<string, any>) =>
    apiGet(`${BASE_URL}/integrations/outlook/bindings`, { params, ...(config || {}) }),
  listManagedOutlookSeriesChildren: (
    seriesMasterId: string,
    params?: { mailboxId?: string },
  ) =>
    apiGet(`${BASE_URL}/integrations/outlook/bindings/series/${seriesMasterId}/children`, { params }),
  listAllManagedOutlookBindings: (params?: {
    keyword?: string;
    eventType?: string;
    status?: string;
    page?: number;
    pageSize?: number;
  }) =>
    apiGet(`${BASE_URL}/integrations/outlook/bindings/all`, { params }),
  triggerOutlookReconcile: (mailboxId?: string) =>
    apiPost(`${BASE_URL}/integrations/outlook/sync/reconcile`, { mailboxId }),
  getOutlookSyncSettings: () =>
    apiGet(`${BASE_URL}/integrations/outlook/settings`),
  updateOutlookSyncSettings: (payload: Record<string, any>) =>
    apiPatch(`${BASE_URL}/integrations/outlook/settings`, payload),

  // v1.2 签到方式校验
  updateMeetingEnforceCheckinMode: (id: string, enforceCheckinMode: boolean) =>
    apiPatch(`${BASE_URL}/meetings/${id}/enforce-checkin-mode`, { enforceCheckinMode }),
  updateRequiredAttendeeCheckinMode: (
    meetingId: string,
    userId: string,
    checkinMode: CheckinMode | null,
  ) =>
    apiPatch(
      `${BASE_URL}/meetings/${meetingId}/required-attendees/${encodeURIComponent(userId)}/checkin-mode`,
      { checkinMode },
    ),
  updateSeriesEnforceCheckinMode: (id: string, enforceCheckinMode: boolean) =>
    apiPatch(`${BASE_URL}/series/${id}/enforce-checkin-mode`, { enforceCheckinMode }),
  listSeriesAttendeePreferences: (
    id: string,
    params?: { page?: number; pageSize?: number; keyword?: string },
  ) => apiGet(`${BASE_URL}/series/${id}/attendee-preferences`, { params }),
  upsertSeriesAttendeePreferences: (
    id: string,
    preferences: Array<{ userId: string; defaultCheckinMode: CheckinMode }>,
  ) => apiPut(`${BASE_URL}/series/${id}/attendee-preferences`, { preferences }),
  deleteSeriesAttendeePreference: (id: string, userId: string) =>
    apiDelete(`${BASE_URL}/series/${id}/attendee-preferences/${encodeURIComponent(userId)}`),
  listCitySuggestions: (params?: { keyword?: string; limit?: number }) =>
    apiGet(`${BASE_URL}/cities/suggestions`, { params }),
};
