import React from 'react';

import { Button, FormControl, FormErrorMessage, FormLabel, Input, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalOverlay } from '@chakra-ui/react';
import { SubmitHandler, useForm } from 'react-hook-form';

import { useMutation, useQueryClient } from 'react-query';
import { ApiError, ItemOut, ItemUpdate, ItemsService } from '../../client';
import useCustomToast from '../../hooks/useCustomToast';

interface EditItemProps {
    item: ItemOut;
    isOpen: boolean;
    onClose: () => void;
}

const EditItem: React.FC<EditItemProps> = ({ item, isOpen, onClose }) => {
    const queryClient = useQueryClient();
    const showToast = useCustomToast();
    const { register, handleSubmit, reset, formState: { isSubmitting, errors, isDirty } } = useForm<ItemUpdate>({
        mode: 'onBlur',
        criteriaMode: 'all',
        defaultValues: item
    });

    const updateItem = async (data: ItemUpdate) => {
        await ItemsService.updateItem({ id: item.id, requestBody: data });
    }

    const mutation = useMutation(updateItem, {
        onSuccess: () => {
            showToast('Success!', 'Item updated successfully.', 'success');
            onClose();
        },
        onError: (err: ApiError) => {
            const errDetail = err.body.detail;
            showToast('Something went wrong.', `${errDetail}`, 'error');
        },
        onSettled: () => {
            queryClient.invalidateQueries('items');
        }
    });

    const onSubmit: SubmitHandler<ItemUpdate> = async (data) => {
        mutation.mutate(data)
    }

    const onCancel = () => {
        reset();
        onClose();
    }

    return (
        <>
            <Modal
                isOpen={isOpen}
                onClose={onClose}
                size={{ base: 'sm', md: 'md' }}
                isCentered
            >
                <ModalOverlay />
                <ModalContent as='form' onSubmit={handleSubmit(onSubmit)}>
                    <ModalHeader>Edit Item</ModalHeader>
                    <ModalCloseButton />
                    <ModalBody pb={6}>
                        <FormControl isInvalid={!!errors.title}>
                            <FormLabel htmlFor='title'>Title</FormLabel>
                            <Input id='title' {...register('title', { required: 'Title is required' })} type='text' />
                            {errors.title && <FormErrorMessage>{errors.title.message}</FormErrorMessage>}
                        </FormControl>
                        <FormControl mt={4}>
                            <FormLabel htmlFor='description'>Description</FormLabel>
                            <Input id='description' {...register('description')} placeholder='Description' type='text' />
                        </FormControl>
                    </ModalBody>
                    <ModalFooter gap={3}>
                        <Button bg='ui.main' color='white' _hover={{ opacity: 0.8 }} type='submit' isLoading={isSubmitting} isDisabled={!isDirty}>
                            Save
                        </Button>
                        <Button onClick={onCancel}>Cancel</Button>
                    </ModalFooter>
                </ModalContent>
            </Modal>
        </>
    )
}

export default EditItem;