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

import React from "react";
import { Typography } from "@material-ui/core";
import { TreeItem } from "components/tree/tree";
import { WrappedFieldProps } from 'redux-form';
import { ProjectsTreePicker } from 'views-components/projects-tree-picker/projects-tree-picker';
import { ProjectsTreePickerItem } from 'store/tree-picker/tree-picker-middleware';
import { PickerIdProp } from 'store/tree-picker/picker-id';
import { FileOperationLocation, getFileOperationLocation } from "store/tree-picker/tree-picker-actions";
import { connect } from "react-redux";
import { Dispatch } from "redux";

export const ProjectTreePickerField = (props: WrappedFieldProps & PickerIdProp) =>
    <div style={{ display: 'flex', minHeight: 0, flexDirection: 'column' }}>
        <div style={{ flexBasis: '275px', flexShrink: 1, minHeight: 0, display: 'flex', flexDirection: 'column' }}>
            <ProjectsTreePicker
                pickerId={props.pickerId}
                toggleItemActive={handleChange(props)}
                cascadeSelection={false}
                options={{ showOnlyOwned: false, showOnlyWritable: true }} />
            {props.meta.dirty && props.meta.error &&
                <Typography variant='caption' color='error'>
                    {props.meta.error}
                </Typography>}
        </div>
    </div>;

const handleChange = (props: WrappedFieldProps) =>
    (_: any, { id }: TreeItem<ProjectsTreePickerItem>) =>
        props.input.onChange(id);

export const CollectionTreePickerField = (props: WrappedFieldProps & PickerIdProp) =>
    <div style={{ display: 'flex', minHeight: 0, flexDirection: 'column' }}>
        <div style={{ flexBasis: '275px', flexShrink: 1, minHeight: 0, display: 'flex', flexDirection: 'column' }}>
            <ProjectsTreePicker
                pickerId={props.pickerId}
                toggleItemActive={handleChange(props)}
                cascadeSelection={false}
                options={{ showOnlyOwned: false, showOnlyWritable: true }}
                includeCollections />
            {props.meta.dirty && props.meta.error &&
                <Typography variant='caption' color='error'>
                    {props.meta.error}
                </Typography>}
        </div>
    </div>;

type ProjectsTreePickerActionProps = {
    getFileOperationLocation: (item: ProjectsTreePickerItem) => Promise<FileOperationLocation | undefined>;
}

const projectsTreePickerMapDispatchToProps = (dispatch: Dispatch): ProjectsTreePickerActionProps => ({
    getFileOperationLocation: (item: ProjectsTreePickerItem) => dispatch<any>(getFileOperationLocation(item)),
});

type ProjectsTreePickerCombinedProps = ProjectsTreePickerActionProps & WrappedFieldProps & PickerIdProp;

export const DirectoryTreePickerField = connect(null, projectsTreePickerMapDispatchToProps)(
    class DirectoryTreePickerFieldComponent extends React.Component<ProjectsTreePickerCombinedProps> {

        handleDirectoryChange = (props: WrappedFieldProps) =>
            async (_: any, { data }: TreeItem<ProjectsTreePickerItem>) => {
                const location = await this.props.getFileOperationLocation(data);
                props.input.onChange(location || '');
            }

        render() {
            return <div style={{ display: 'flex', minHeight: 0, flexDirection: 'column' }}>
                <div style={{ flexBasis: '275px', flexShrink: 1, minHeight: 0, display: 'flex', flexDirection: 'column' }}>
                    <ProjectsTreePicker
                        currentUuids={[this.props.input.value.uuid]}
                        pickerId={this.props.pickerId}
                        toggleItemActive={this.handleDirectoryChange(this.props)}
                        cascadeSelection={false}
                        options={{ showOnlyOwned: false, showOnlyWritable: true }}
                        includeCollections
                        includeDirectories />
                    {this.props.meta.dirty && this.props.meta.error &&
                        <Typography variant='caption' color='error'>
                            {this.props.meta.error}
                        </Typography>}
                </div>
            </div>;
        }
    });