import { createSlice, createAsyncThunk, createEntityAdapter } from '@reduxjs/toolkit'
import { request } from 'api'

const trendsAdapter = createEntityAdapter({
    selectId: trend => trend.locations[0].woeid,
    sortComparer: (a, b) => (b.trends.length - a.trends.length)
})
const initialState = trendsAdapter.getInitialState({
    status: 'idle'
})

export const getTrends = createAsyncThunk(
    'trends/getTrends',
    async (woeid = 1, { dispatch }) => {
        let { locations, trends } = await request(`/api/trends?woeid=${woeid}`, { dispatch });
        return { locations, trends }
    }
)

const trendsSlice = createSlice({
    name: 'trends',
    initialState,
    reducers: {},
    extraReducers: {
        [getTrends.rejected]: state => { state.status = 'error' },
        [getTrends.pending]: state => { state.status = 'loading' },
        [getTrends.fulfilled]: (state, action) => {
            state.status = 'idle'
            trendsAdapter.upsertOne(state, action.payload)
        }
    }
})
const { actions, reducer } = trendsSlice
export default reducer
export const { queryChanged } = actions

export const trendsSelectors = trendsAdapter.getSelectors(state => state.trends)