// resources\assets\ts\DataPage\pointsSlice.ts
import {
  createAsyncThunk,
  createEntityAdapter,
  createSlice,
} from '@reduxjs/toolkit';
import axios from 'B/axios';

// import { RootState } from '../../../DataPage/rootReducer'; // Changed from DataPage-specific RootState to generic RootStateWithSlice
interface RootStateWithSlice {
  points: any;  

}

interface Point {
  id: number;
  result: any; // json
  created_at: string;
}

const pointsAdapter = createEntityAdapter<Point>();

export const fetchPointsTable = createAsyncThunk(
  'fetch_points_table',
  async (ergID: number) => {
    const r = await axios.get(`/c/${ergID}/pointstable`);

    return { table: r.data, ergID };
  },
);

export const fetchPoints = createAsyncThunk(
  'fetch_points',
  async (ergID: number, thunkAPI) => {
    const havePoints =
      // (thunkAPI.getState() as RootState).points.ergs[ergID] !== undefined;
           (thunkAPI.getState() as RootStateWithSlice).points.ergs[ergID];
    if (havePoints) {
      return { points: [], ergID };
    }

    const r = await axios.get(`c/${ergID}/points`);

    return { points: r.data as Point[], ergID };
  },
);

const slice = createSlice({
  name: 'data/points',
  initialState: pointsAdapter.getInitialState({ ergs: {}, tables: {} }),
  reducers: {},
  extraReducers: (builder) => {
    builder.addCase(fetchPoints.fulfilled, (state, { payload }) => {
      const isClose = payload.points.length === 0;
      if (isClose) {
        delete state.ergs[payload.ergID];
        return;
      }

      pointsAdapter.upsertMany(state, payload.points);
      state.ergs[payload.ergID] = payload.points.map((c) => c.id);
    });

    builder.addCase(fetchPointsTable.fulfilled, (state, { payload }) => {
      const haveTableData = state.tables[payload.ergID] !== undefined;
      if (haveTableData) {
        delete state.tables[payload.ergID];
        return;
      }

      state.tables[payload.ergID] = payload.table;
    });
  },
});

export default slice.reducer;
