import { configureStore, Reducer, Action, AnyAction, Store, combineReducers } from '@reduxjs/toolkit';
import { createTransform, persistStore, persistReducer, FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER } from 'redux-persist';
import storage from 'redux-persist/lib/storage';

import addOnsReducer from './slices/addOnsSlice';
import authReducer from './slices/authSlice';
import businessVerticalsReducer from './slices/businessVerticalsSlice';
import paymentPlansReducer from './slices/paymentPlansSlice';
import priceConfigurationsReducer from './slices/priceConfigurationsSlice';
import clientCompaniesReducer from './slices/clientCompaniesSlice';
import clientContactsReducer from './slices/clientContactsSlice';
import uiReducer from './slices/uiSlice';
import countryReducer from './slices/countrySlice';
import stateReducer from './slices/stateSlice';
import cityReducer from './slices/citySlice';
import clientTypesReducer from './slices/clientTypesSlice';
import contractCoverageReducer from './slices/contractCoverageSlice';
import currencyReducer from './slices/currencySlice';
import departmentsReducer from './slices/departmentsSlice';
import rolesReducer from './slices/rolesSlice';
import teamMembersReducer from './slices/teamMembersSlice';
import vehicleMakesReducer from './slices/vehicleMakesSlice';
import vehicleModelsReducer from './slices/vehicleModelsSlice';
import vehicleStatusesReducer from './slices/vehicleStatusesSlice';
import vehicleTypesReducer from './slices/vehicleTypesSlice';
import vehiclesReducer from './slices/vehiclesSlice';
import vehicleInsuranceReducer from './slices/vehicleInsuranceSlice';
import maintenanceReducer from './slices/vehicleMaintenance';
import hospitalReducer from './slices/hospitalSlice';
import hospitalContactsReducer from './slices/hospitalContactSlice';
import inspectionQuestionsReducer from './slices/inspectionQuestionsSlice';
import inspectionReportsReducer from './slices/inspectionReportsSlice';
import customersReducer from './slices/customerSlice';
import escortsReducer from './slices/escortsSlice';
import TripReducer from './slices/tripSlice';
import pricingReducer from './slices/pricingSlice';
import chargesTypesReducer from './slices/chargeTypesSlice';
import incidentReportingReducer from './slices/incidentReportingSlice';
import clientContractsReducer from './slices/clientContractsSlice';
import dashboardReducer from './slices/dashboardSlice';
import notificationsReducer, { notificationsInitialState } from './slices/notificationsSlice';
import customerTagsReducer from './slices/customerTagsSlice';
import reportsReducer from './slices/reportsSlice';
import treatmentPlanReducer from './slices/treatmentPlanSlice';
import invoiceSettingsReducer from './slices/invoiceSettingsSlice';
import invoicesReducer from './slices/invoicesSlice';
import paymentsReducer from './slices/paymentsSlice';

const normalizeUnreadCount = (value: unknown): number => {
    if (typeof value !== 'number' || !Number.isFinite(value)) return notificationsInitialState.unreadCount;
    return Math.max(0, Math.floor(value));
};

/** Persist only unread count; list/pagination stay in memory (rehydrate merges into fresh slice defaults). */
const notificationsPersistTransform = createTransform(
    (inboundState: unknown) => {
        const n = inboundState as { unreadCount?: unknown };
        return { unreadCount: normalizeUnreadCount(n?.unreadCount) };
    },
    (outboundState: unknown) => {
        const n = outboundState as { unreadCount?: unknown };
        return {
            ...notificationsInitialState,
            unreadCount: normalizeUnreadCount(n?.unreadCount),
        };
    },
    { whitelist: ['notifications'] },
);

const persistConfig = {
    key: 'admin',
    keyPrefix: '',
    storage,
    whitelist: ['auth', 'notifications'],
    transforms: [notificationsPersistTransform],
};

const rootReducer = {
    auth: authReducer,
    teamMembers: teamMembersReducer,
    roles: rolesReducer,
    departments: departmentsReducer,
    businessVerticals: businessVerticalsReducer,
    vehicleTypes: vehicleTypesReducer,
    vehicleMakes: vehicleMakesReducer,
    vehicleModels: vehicleModelsReducer,
    addOns: addOnsReducer,
    clientTypes: clientTypesReducer,
    vehicleStatuses: vehicleStatusesReducer,
    contractCoverage: contractCoverageReducer,
    paymentPlans: paymentPlansReducer,
    priceConfigurations: priceConfigurationsReducer,
    clientCompanies: clientCompaniesReducer,
    clientContacts: clientContactsReducer,
    clientContracts: clientContractsReducer,
    ui: uiReducer,
    countries: countryReducer,
    states: stateReducer,
    cities: cityReducer,
    currencies: currencyReducer,
    vehicles: vehiclesReducer,
    vehiclesInsurance: vehicleInsuranceReducer,
    maintenance: maintenanceReducer,
    hospitals: hospitalReducer,
    hospitalContacts: hospitalContactsReducer,
    inspectionQuestions: inspectionQuestionsReducer,
    inspectionReports: inspectionReportsReducer,
    customers: customersReducer,
    trips: TripReducer,
    escorts: escortsReducer,
    pricing: pricingReducer,
    chargeTypes: chargesTypesReducer,
    incidentReporting: incidentReportingReducer,
    dashboard: dashboardReducer,
    notifications: notificationsReducer,
    customerTags: customerTagsReducer,
    reports: reportsReducer,
    treatmentPlans: treatmentPlanReducer,
    invoiceSettings: invoiceSettingsReducer,
    invoices: invoicesReducer,
    payments: paymentsReducer,
};

export const makeStore = () => {
    const store = configureStore({
        reducer: persistReducer(persistConfig, combineReducers(rootReducer)),
        middleware: (getDefaultMiddleware) =>
            getDefaultMiddleware({
                // serializableCheck: {
                //     ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER],
                // },
                serializableCheck: false,
            }),
        devTools: process.env.NODE_ENV !== 'production',
    });

    const persistor = persistStore(store);
    return { store, persistor };
};

export type RootState = ReturnType<ReturnType<typeof makeStore>['store']['getState']>;
export type AppDispatch = ReturnType<typeof makeStore>['store']['dispatch'];
