import { RejectedActionPayload } from '@/interface/Shared';
import { apiGet } from '@/services/api/api';
import Helpers from '@/utilities/Helpers';
import { createAsyncThunk, createSlice, Draft, PayloadAction } from '@reduxjs/toolkit';
import { message } from 'antd';
import axios, { AxiosResponse } from 'axios';

interface AuditLogsState {
  logs: AuditLog[];
  filters: AuditLogFilters | null;
  loading: boolean;
  filtersLoading: boolean;
  total: number;
  meta: AuditLogPaginationMeta | null;
}

const initialState: AuditLogsState = {
  logs: [],
  filters: null,
  loading: false,
  filtersLoading: false,
  total: 0,
  meta: null,
};

export const fetchAuditLogs = createAsyncThunk(
  'auditLogs/fetchAuditLogs',
  async (queryString: string | undefined, { rejectWithValue }) => {
    try {
      const query = queryString ? `?${queryString}` : '';
      const response = (await apiGet(`/audit-logs${query}`)) as AxiosResponse<{
        data: AuditLog[];
        meta: AuditLogPaginationMeta;
      }>;
      return response.data;
    } catch (error) {
      if (axios.isAxiosError(error) && error.response) {
        return rejectWithValue(error.response.data);
      }
      throw error;
    }
  },
);

export const fetchAuditLogFilters = createAsyncThunk(
  'auditLogs/fetchAuditLogFilters',
  async (_, { rejectWithValue }) => {
    try {
      const response = (await apiGet('/audit-logs/filters')) as AxiosResponse<AuditLogFilters>;
      return response.data;
    } catch (error) {
      if (axios.isAxiosError(error) && error.response) {
        return rejectWithValue(error.response.data);
      }
      throw error;
    }
  },
);

const AuditLogsSlice = createSlice({
  name: 'auditLogs',
  initialState,
  reducers: {},
  extraReducers(builder) {
    builder
      .addCase(fetchAuditLogs.pending, (state: Draft<AuditLogsState>) => {
        state.loading = true;
      })
      .addCase(
        fetchAuditLogs.fulfilled,
        (
          state: Draft<AuditLogsState>,
          action: PayloadAction<{ data: AuditLog[]; meta: AuditLogPaginationMeta }>,
        ) => {
          state.loading = false;
          state.logs = action.payload.data;
          state.meta = action.payload.meta;
          state.total = action.payload.meta.total;
        },
      )
      .addCase(fetchAuditLogs.rejected, (state: Draft<AuditLogsState>, action: RejectedActionPayload) => {
        state.loading = false;
        message.error(Helpers.handleServerError(action.payload), 10);
      });

    builder
      .addCase(fetchAuditLogFilters.pending, (state: Draft<AuditLogsState>) => {
        state.filtersLoading = true;
      })
      .addCase(
        fetchAuditLogFilters.fulfilled,
        (state: Draft<AuditLogsState>, action: PayloadAction<AuditLogFilters>) => {
          state.filtersLoading = false;
          state.filters = action.payload;
        },
      )
      .addCase(
        fetchAuditLogFilters.rejected,
        (state: Draft<AuditLogsState>, action: RejectedActionPayload) => {
          state.filtersLoading = false;
          message.error(Helpers.handleServerError(action.payload), 10);
        },
      );
  },
});

export default AuditLogsSlice;
export type { AuditLogsState };
