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

import * as React from 'react';
import { Field, InjectedFormProps, WrappedFieldProps } from "redux-form";
import { TextField } from "~/components/text-field/text-field";
import { NativeSelectField } from "~/components/select-field/select-field";
import {
    StyleRulesCallback,
    WithStyles,
    withStyles,
    Card,
    CardContent,
    Button,
    Typography,
    Grid,
    InputLabel
} from '@material-ui/core';
import { ArvadosTheme } from '~/common/custom-theme';
import { User } from "~/models/user";
import { MY_ACCOUNT_VALIDATION } from "~/validators/validators";

type CssRules = 'root' | 'gridItem' | 'label' | 'title' | 'actions';

const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
    root: {
        width: '100%',
        overflow: 'auto'
    },
    gridItem: {
        height: 45,
        marginBottom: 20
    },
    label: {
        fontSize: '0.675rem'
    },
    title: {
        marginBottom: theme.spacing.unit * 3,
        color: theme.palette.grey["600"]
    },
    actions: {
        display: 'flex',
        justifyContent: 'flex-end'
    }
});

export interface MyAccountPanelRootActionProps { }

export interface MyAccountPanelRootDataProps {
    isPristine: boolean;
    isValid: boolean;
    initialValues?: User;
    localCluster: string;
}

const RoleTypes = [
    { key: 'Bio-informatician', value: 'Bio-informatician' },
    { key: 'Data Scientist', value: 'Data Scientist' },
    { key: 'Analyst', value: 'Analyst' },
    { key: 'Researcher', value: 'Researcher' },
    { key: 'Software Developer', value: 'Software Developer' },
    { key: 'System Administrator', value: 'System Administrator' },
    { key: 'Other', value: 'Other' }
];

type MyAccountPanelRootProps = InjectedFormProps<MyAccountPanelRootActionProps> & MyAccountPanelRootDataProps & WithStyles<CssRules>;

type LocalClusterProp = { localCluster: string };
const renderField: React.ComponentType<WrappedFieldProps & LocalClusterProp> = ({ input, localCluster }) => (
    <span>{localCluster === input.value.substr(0, 5) ? "" : "federated"} user {input.value}</span>
);

export const MyAccountPanelRoot = withStyles(styles)(
    ({ classes, isValid, handleSubmit, reset, isPristine, invalid, submitting, localCluster }: MyAccountPanelRootProps) => {
        return <Card className={classes.root}>
            <CardContent>
                <Typography variant="title" className={classes.title}>
                    Logged in as <Field name="uuid" component={renderField} localCluster={localCluster} />
                </Typography>
                <form onSubmit={handleSubmit}>
                    <Grid container spacing={24}>
                        <Grid item className={classes.gridItem} sm={6} xs={12}>
                            <Field
                                label="First name"
                                name="firstName"
                                component={TextField}
                                disabled
                            />
                        </Grid>
                        <Grid item className={classes.gridItem} sm={6} xs={12}>
                            <Field
                                label="Last name"
                                name="lastName"
                                component={TextField}
                                disabled
                            />
                        </Grid>
                        <Grid item className={classes.gridItem} sm={6} xs={12}>
                            <Field
                                label="E-mail"
                                name="email"
                                component={TextField}
                                disabled
                            />
                        </Grid>
                        <Grid item className={classes.gridItem} sm={6} xs={12}>
                            <Field
                                label="Username"
                                name="username"
                                component={TextField}
                                disabled
                            />
                        </Grid>
                        <Grid item className={classes.gridItem} sm={6} xs={12}>
                            <Field
                                label="Organization"
                                name="prefs.profile.organization"
                                component={TextField}
                                validate={MY_ACCOUNT_VALIDATION}
                                required
                            />
                        </Grid>
                        <Grid item className={classes.gridItem} sm={6} xs={12}>
                            <Field
                                label="E-mail at Organization"
                                name="prefs.profile.organization_email"
                                component={TextField}
                                validate={MY_ACCOUNT_VALIDATION}
                                required
                            />
                        </Grid>
                        <Grid item className={classes.gridItem} sm={6} xs={12}>
                            <InputLabel className={classes.label} htmlFor="prefs.profile.role">Role</InputLabel>
                            <Field
                                id="prefs.profile.role"
                                name="prefs.profile.role"
                                component={NativeSelectField}
                                items={RoleTypes}
                            />
                        </Grid>
                        <Grid item className={classes.gridItem} sm={6} xs={12}>
                            <Field
                                label="Website"
                                name="prefs.profile.website_url"
                                component={TextField}
                            />
                        </Grid>
                        <Grid container direction="row" justify="flex-end" >
                            <Button color="primary" onClick={reset} disabled={isPristine}>Discard changes</Button>
                            <Button
                                color="primary"
                                variant="contained"
                                type="submit"
                                disabled={isPristine || invalid || submitting}>
                                Save changes
                            </Button>
                        </Grid>
                    </Grid>
                </form >
            </CardContent >
        </Card >;
    }
);