import { useEffect, useState } from 'react';
import type { CompanyDbModel } from '../../../Companies/Components/CompaniesComponents.helper';
import { useUiContext } from '../../../../Store/UiContext/UiContext';
import { useDispatch, useSelector } from 'react-redux';
import type { AppDispatch, RootState } from '../../../../ReduxState/store';
import {
	downloadMultipleCSVsAsZip,
	getFinancialsList,
	getInvitesList
} from './DeleteInvitee.helper';
import type { FinancialsModel } from '../../../Financials/Components/FinancialsForm/FinancialsForm.helper';
import type { InvitedUserInterface } from '../../Pages/ManageUsers/Components/ManageUsersPage';
import { deleteCompany, fetchCompanyData } from '../../../../ReduxState/companies/companiesSlice';
import { Button } from '@mui/material';
import { DeleteOutline } from '@mui/icons-material';
import type { UserModel } from '../../../../Store/User/user-context.helper';
import { deleteInvation, deleteInvitedUser } from '../../../../ReduxState/invites/invitesSlice';

const DeleteInvitee = ({
	invitee,
	isRevoke = false
}: {
	invitee: InvitedUserInterface | null | undefined;
	isRevoke?: boolean;
}): JSX.Element => {
	const { confirmModal } = useUiContext();
	const dispatch = useDispatch<AppDispatch>();

	const selectedUser: UserModel | null = useSelector((state: RootState) => state.login.user);
	const selectedCompany: CompanyDbModel | null = useSelector(
		(state: RootState) => state.companies.selectedCompany
	);
	const deleteStatus = useSelector((state: RootState) => state.invites.deleteStatus);
	const [selfDelete, setSelfDelete] = useState<boolean>(false);

	const determineSelfDelete = async (): Promise<void> => {
		setSelfDelete(invitee?.invitee_username === selectedUser?.cognito_username);
		const title =
			invitee?.invitee_username === selectedUser?.cognito_username
				? `Confirm self removal`
				: `Confirm remove user`;
		const message =
			invitee?.invitee_username === selectedUser?.cognito_username
				? `This action will revoke your access to ${selectedCompany?.company_name} and all associated data. This action cannot be undone.`
				: `Removing ${invitee?.invite_full_name} with email ${invitee?.invite_email} will revoke their access to ${selectedCompany?.company_name} and all associated data. This action cannot be undone.`;

		const isConfirmed = await confirmModal({
			title,
			message,
			confirmButtonText: 'Confirm removal',
			cancelButtonText: 'Cancel'
		});
		if (isConfirmed) {
			// console.log('TODO: Implement Self Delete', invitee, selectedUser);
			dispatch(deleteInvitedUser({ inviteUuid: invitee?.invite_uuid || '' }));
		}
	};

	const deleteInvite = async (): Promise<void> => {
		const isConfirmed = await confirmModal({
			title: 'Confirm delete invite',
			message: `Are you sure you want to remove ${invitee?.invite_full_name} with email ${invitee?.invite_email}`,
			confirmButtonText: 'Confirm removal',
			cancelButtonText: 'Cancel'
		});
		if (isConfirmed) {
			// console.log('revoke access for invitee', invitee);
			dispatch(deleteInvation({ inviteUuid: invitee?.invite_uuid || '' }));
		}
	};

	useEffect(() => {
		if (deleteStatus === 'success') {
			console.log('USER REMOVED, IF SELF DELETION REFRESH COMPANIES LIST');
			if (invitee?.invitee_username === selectedUser?.cognito_username) {
				dispatch(fetchCompanyData());
			}
		}
	}, [deleteStatus]);

	useEffect(() => {
		if (!isRevoke) {
			determineSelfDelete();
		} else {
			deleteInvite();
		}
	}, [invitee]);

	return <></>;
};

export default DeleteInvitee;
