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

import React from 'react';
import { ExpansionPanel, ExpansionPanelDetails, ExpansionPanelSummary } from '@material-ui/core';
import { reduxForm, Field } from 'redux-form';
import { Grid } from '@material-ui/core';
import { TextField } from 'components/text-field/text-field';
import { ExpandIcon } from 'components/icon/icon';
import * as IntInput from './inputs/int-input';
import { min } from 'validators/min';
import { optional } from 'validators/optional';
import { PROCESS_NAME_VALIDATION } from 'validators/validators';

export const RUN_PROCESS_ADVANCED_FORM = 'runProcessAdvancedForm';

export const DESCRIPTION_FIELD = 'description';
export const OUTPUT_FIELD = 'output';
export const RUNTIME_FIELD = 'runtime';
export const RAM_FIELD = 'ram';
export const VCPUS_FIELD = 'vcpus';
export const KEEP_CACHE_RAM_FIELD = 'keep_cache_ram';
export const RUNNER_IMAGE_FIELD = 'acr_container_image';

export interface RunProcessAdvancedFormData {
    [DESCRIPTION_FIELD]?: string;
    [OUTPUT_FIELD]?: string;
    [RUNTIME_FIELD]?: number;
    [RAM_FIELD]: number;
    [VCPUS_FIELD]: number;
    [KEEP_CACHE_RAM_FIELD]: number;
    [RUNNER_IMAGE_FIELD]: string;
}

export const RunProcessAdvancedForm =
    reduxForm<RunProcessAdvancedFormData>({
        form: RUN_PROCESS_ADVANCED_FORM,
    })(() =>
        <form>
            <ExpansionPanel elevation={0}>
                <ExpansionPanelSummary style={{ padding: 0 }} expandIcon={<ExpandIcon />}>
                    Advanced
                </ExpansionPanelSummary>
                <ExpansionPanelDetails style={{ padding: 0 }}>
                    <Grid container spacing={32}>
			<Grid item xs={12} md={6}>
			    <Field
				name={DESCRIPTION_FIELD}
				     component={TextField as any}
				     label="Optional description" />
			</Grid>
                        <Grid item xs={12} md={6}>
                            <Field
                                name={OUTPUT_FIELD}
                                component={TextField as any}
                                label="Output name" />
                        </Grid>
                        <Grid item xs={12} md={6}>
                            <Field
                                name={RUNTIME_FIELD}
                                component={TextField as any}
                                helperText="Maximum running time (in seconds) that this container will be allowed to run before being cancelled."
                                label="Runtime limit"
                                parse={IntInput.parse}
                                format={IntInput.format}
                                type='number'
                                validate={runtimeValidation} />
                        </Grid>
                        <Grid item xs={12} md={6}>
                            <Field
                                name={RAM_FIELD}
                                component={TextField as any}
                                label="RAM"
                                helperText="Number of ram bytes to be used to run this process."
                                parse={IntInput.parse}
                                format={IntInput.format}
                                type='number'
                                required
                                validate={ramValidation} />
                        </Grid>
                        <Grid item xs={12} md={6}>
                            <Field
                                name={VCPUS_FIELD}
                                component={TextField as any}
                                label="VCPUs"
                                helperText="Number of cores to be used to run this process."
                                parse={IntInput.parse}
                                format={IntInput.format}
                                type='number'
                                required
                                validate={vcpusValidation} />
                        </Grid>
                        <Grid item xs={12} md={6}>
                            <Field
                                name={KEEP_CACHE_RAM_FIELD}
                                component={TextField as any}
                                label="Keep cache RAM"
                                helperText="Number of keep cache bytes to be used to run this process."
                                parse={IntInput.parse}
                                format={IntInput.format}
                                type='number'
                                validate={keepCacheRamValidation} />
                        </Grid>
                        <Grid item xs={12} md={6}>
                            <Field
                                name={RUNNER_IMAGE_FIELD}
                                component={TextField as any}
                                label='Runner'
                                required
                                helperText='The container image with arvados-cwl-runner that will execute this workflow.' />
                        </Grid>
                    </Grid>
                </ExpansionPanelDetails>
            </ExpansionPanel>
        </form >);

const ramValidation = [min(0)];
const vcpusValidation = [min(1)];
const keepCacheRamValidation = [optional(min(0))];
const runtimeValidation = [optional(min(1))];