// Copyright (C) The Arvados Authors. All rights reserved.
//
// SPDX-License-Identifier: AGPL-3.0

import React from 'react';
import { InjectedFormProps } from 'redux-form';
import { Dialog, DialogActions, DialogContent, DialogTitle } from '@material-ui/core/';
import { Button, StyleRulesCallback, WithStyles, withStyles, CircularProgress } from '@material-ui/core';
import { WithDialogProps } from 'store/dialog/with-dialog';

type CssRules = "button" | "lastButton" | "form" | "formContainer" | "dialogTitle" | "progressIndicator" | "dialogActions";

const styles: StyleRulesCallback<CssRules> = theme => ({
    button: {
        marginLeft: theme.spacing.unit
    },
    lastButton: {
        marginLeft: theme.spacing.unit,
        marginRight: "0",
    },
    form: {
        display: 'flex',
        overflowY: 'auto',
        flexDirection: 'column',
        flex: '0 1 auto',
    },
    formContainer: {
        display: "flex",
        flexDirection: "column",
        paddingBottom: "0",
    },
    dialogTitle: {
        paddingTop: theme.spacing.unit,
        paddingBottom: theme.spacing.unit,
    },
    progressIndicator: {
        position: "absolute",
        minWidth: "20px",
    },
    dialogActions: {
        marginBottom: theme.spacing.unit,
        marginRight: theme.spacing.unit * 3,
    }
});

interface DialogProjectDataProps {
    cancelLabel?: string;
    dialogTitle: string;
    formFields: React.ComponentType<InjectedFormProps<any> & WithDialogProps<any>>;
    submitLabel?: string;
    cancelCallback?: Function;
    enableWhenPristine?: boolean;
    doNotDisableCancel?: boolean;
}

type DialogProjectProps = DialogProjectDataProps & WithDialogProps<{}> & InjectedFormProps<any> & WithStyles<CssRules>;

export const FormDialog = withStyles(styles)((props: DialogProjectProps) =>
    <Dialog
        open={props.open}
        onClose={props.closeDialog}
        disableBackdropClick
        disableEscapeKeyDown={props.submitting}
        fullWidth
        maxWidth='md'>
        <form data-cy='form-dialog' className={props.classes.form}>
            <DialogTitle className={props.classes.dialogTitle}>
                {props.dialogTitle}
            </DialogTitle>
            <DialogContent className={props.classes.formContainer}>
                <props.formFields {...props} />
            </DialogContent>
            <DialogActions className={props.classes.dialogActions}>
                <Button
                    data-cy='form-cancel-btn'
                    onClick={() => {
                        props.closeDialog();

                        if (props.cancelCallback) {
                            props.cancelCallback();
                            props.reset();
                            props.initialize({});
                        }
                    }}
                    className={props.classes.button}
                    color="primary"
                    disabled={props.doNotDisableCancel ? false : props.submitting}>
                    {props.cancelLabel || 'Cancel'}
                </Button>
                <Button
                    data-cy='form-submit-btn'
                    type="submit"
                    onClick={props.handleSubmit}
                    className={props.classes.lastButton}
                    color="primary"
                    disabled={props.invalid || props.submitting || (props.pristine && !props.enableWhenPristine)}
                    variant="contained">
                    {props.submitLabel || 'Submit'}
                    {props.submitting && <CircularProgress size={20} className={props.classes.progressIndicator} />}
                </Button>
            </DialogActions>
        </form>
    </Dialog>
);