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

import * as React from "react";
import { compose, Dispatch } from "redux";
import { connect } from "react-redux";
import { Dialog, DialogTitle, DialogContent, DialogActions, Button, Typography } from "@material-ui/core";
import { WithDialogProps } from "~/store/dialog/with-dialog";
import { withDialog } from '~/store/dialog/with-dialog';
import { WithStyles, withStyles } from '@material-ui/core/styles';
import { ArvadosTheme } from '~/common/custom-theme';
import { USER_MANAGEMENT_DIALOG, openSetupShellAccount, loginAs } from "~/store/users/users-actions";
import { getUserDisplayName } from "~/models/user";

type CssRules = 'spacing';

const styles = withStyles<CssRules>((theme: ArvadosTheme) => ({
    spacing: {
        paddingBottom: theme.spacing.unit * 2,
        paddingTop: theme.spacing.unit * 2,
    }
}));

interface UserManageDataProps {
    data: any;
}

interface UserManageActionProps {
    openSetupShellAccount: (uuid: string) => void;
    loginAs: (uuid: string) => void;
}

const mapDispatchToProps = (dispatch: Dispatch) => ({
    openSetupShellAccount: (uuid: string) => dispatch<any>(openSetupShellAccount(uuid)),
    loginAs: (uuid: string) => dispatch<any>(loginAs(uuid))
});

type UserManageProps = UserManageDataProps & UserManageActionProps & WithStyles<CssRules>;

export const UserManageDialog = compose(
    connect(null, mapDispatchToProps),
    withDialog(USER_MANAGEMENT_DIALOG),
    styles)(
        (props: WithDialogProps<UserManageProps> & UserManageProps) =>
            <Dialog open={props.open}
                onClose={props.closeDialog}
                fullWidth
                maxWidth="md">
                {props.data &&
                    <span>
                        <DialogTitle>{`Manage - ${getUserDisplayName(props.data)}`}</DialogTitle>
                        <DialogContent>
                            <Typography variant='body1' className={props.classes.spacing}>
                                As an admin, you can log in as this user. When you’ve finished, you will need to log out and log in again with your own account.
                    </Typography>
                            <Button variant="contained" color="primary" onClick={() => props.loginAs(props.data.uuid)}>
                                {`LOG IN AS ${getUserDisplayName(props.data)}`}
                            </Button>
                            <Typography variant='body1' className={props.classes.spacing}>
                                As an admin, you can setup a shell account for this user. The login name is automatically generated from the user's e-mail address.
                    </Typography>
                            <Button variant="contained" color="primary" onClick={() => props.openSetupShellAccount(props.data.uuid)}>
                                {`SETUP SHELL ACCOUNT FOR ${getUserDisplayName(props.data)}`}
                            </Button>
                        </DialogContent></span>}

                <DialogActions>
                    <Button
                        variant='text'
                        color='primary'
                        onClick={props.closeDialog}>
                        Close
                </Button>
                </DialogActions>
            </Dialog>
    );