/* eslint no-param-reassign: "error" */
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
import type { AxiosResponse } from 'axios';
import axios from 'axios';

import environment from '../../Environments/environment';
import type { CompanyDbModel } from '../../Pages/Companies/Components/CompaniesComponents.helper';
// eslint-disable-next-line import/no-cycle
import type { PaymentInterface } from '../../Pages/ManageSubscription/ManageSubscription';

const { apiUrl, backendRoutes } = environment;

interface PaymentHistoryState {
	payments: PaymentInterface[] | null;
	latestPayment: PaymentInterface | null | undefined;
	paymentExpired: boolean;
}

const initialState: PaymentHistoryState = {
	payments: null,
	latestPayment: undefined,
	paymentExpired: false
};

// helper function to check if payment is expired
export const isPaymentExpired = (latestPayment: PaymentInterface): boolean => {
	if (latestPayment) {
		const currentDate = new Date();
		const paymentDate = new Date(latestPayment.payment_expires);
		const paymentExpiryDate = new Date(paymentDate.setMonth(paymentDate.getMonth() + 1));
		return currentDate > paymentExpiryDate;
	}
	return false;
};

const paymentHistorySlice = createSlice({
	name: 'payment',
	initialState,
	reducers: {},
	extraReducers: (builder) => {
		builder
			.addCase(fetchPaymentData.pending, (state, action) => {
				state.payments = null;
				state.latestPayment = undefined;
			})
			.addCase(fetchPaymentData.fulfilled, (state, action) => {
				if (action.payload) {
					state.payments = action.payload;
					state.latestPayment = state.payments[0] || null;
					state.paymentExpired = isPaymentExpired(state.payments[0]);
				}
			});
		// .addCase(updateUserData.fulfilled, (state, action) => {
		// 	if (action.payload) {
		// 		if (state.user && action.payload.name && action.payload.email) {
		// 			state.user.name = action.payload.name;
		// 			state.user.email = action.payload.email;
		// 		}
		// 	}
		// })
		// .addCase(updateSelectedCharts.fulfilled, (state, action) => {
		// 	console.log('payload in', action);
		// 	if (action.payload) {
		// 		if (state.user) {
		// 			const updatedUser = {
		// 				...state.user,
		// 				selectedCharts: action.payload.selectedDashboardCharts
		// 			};
		// 			console.log('payload in', action.payload);
		// 			state.user = updatedUser;
		// 		}
		// 	}
		// });
		// builder.addCase(logout, (state) => {
		// 	state.fetchingFinished = false;
		// 	state.isLoggedIn = false;
		// 	state.user = null;
		// });
	}
});

export const fetchPaymentData = createAsyncThunk(
	'login/fetchPaymentData',
	async ({ selectedCompany }: { selectedCompany: CompanyDbModel }) => {
		// fetch user data
		console.log('FETCHING FROM SLICE');
		let paymentData = null;
		await axios
			.get(`${apiUrl}/account/payment-history?companyId=${selectedCompany.company_id}`)
			.then((response) => {
				paymentData = response.data;
			});
		return paymentData;
	}
);

// export const updateUserData = createAsyncThunk(
// 	'login/updateUserData',
// 	async (payload: { name: string; email: string }) => {
// 		if (!payload.email || !payload.name) {
// 			throw new Error('Invalid payload');
// 		}
// 		// fetch user data
// 		const user = await axios
// 			.patch(apiUrl + backendRoutes.patchAccount, payload)
// 			.then((results: AxiosResponse<any>) => payload)
// 			.catch((error) => {
// 				console.error(error.message);
// 				return null;
// 			});
// 		return user;
// 	}
// );

// export const {} = paymentHistorySlice.actions;

export default paymentHistorySlice.reducer;
