import { useQueryClient } from '@tanstack/react-query';
import { useEffect, useRef, useState } from '@wordpress/element';
import { applyFix } from '../../shared/api/fixRuns';
import { refreshLinkData } from '../../shared/api/refreshLinkData';
import type { Fix } from '../../shared/api/types/fixes';
import { errorMessage } from '../../shared/ui/errorMessage';
import type { FixAllRequest } from './fixAllRequest';

export type FixAllStep = 'choose' | 'running' | 'done' | 'failed';

export function useFixAllRun() {
	const queryClient = useQueryClient();
	const [ step, setStep ] = useState< FixAllStep >( 'choose' );
	const [ fix, setFix ] = useState< Fix | null >( null );
	const [ failureMessage, setFailureMessage ] = useState( '' );
	const stopper = useRef< AbortController | null >( null );

	useEffect(
		() => () => {
			stopper.current?.abort();
		},
		[]
	);

	const start = async ( request: FixAllRequest ) => {
		const controller = new AbortController();

		stopper.current = controller;
		setStep( 'running' );

		try {
			setFix( await applyFix( request, setFix, controller.signal ) );
			setStep( 'done' );
		} catch ( error ) {
			setFailureMessage( errorMessage( error, '' ) );
			setStep( 'failed' );
		} finally {
			refreshLinkData( queryClient );
		}
	};

	const stop = () => {
		stopper.current?.abort();
	};

	return { step, fix, failureMessage, start, stop };
}
