import React, { ChangeEvent } from "react";
import { ReactNode } from "react";
import { listAllSpaces } from "../../../datasets";
import "./spaceselect.css";

type propTypes = {
    onLoadSpace: (spaceId: string) => boolean;
};

type stateTypes = {
    spaces: string[];
};

export class SpaceSelect extends React.Component<propTypes, stateTypes> {
    constructor(props: propTypes) {
        super(props);
        this.state = {
            spaces: [],
        };

        this.handleSelectChange = this.handleSelectChange.bind(this);
        this.updateSpaceList = this.updateSpaceList.bind(this);

        listAllSpaces().then(this.updateSpaceList);
    }

    /**
     * Render list of spaces as available options.
     * @param spaceList Array containing all available space names.
     */
    updateSpaceList(spaceList: string[]) {
        this.setState({
            spaces: spaceList,
        });
    }

    /**
     * Triggered when another option (space) is selected. Calls given function to load specified space.
     * @param e Select-event that references the select element and allows to access the new value (space).
     */
    handleSelectChange(e: ChangeEvent<HTMLSelectElement>) {
        const success = this.props.onLoadSpace(e.target.value);

        if (!success) {
            alert("Failed to load space with id [" + e.target.value + "]");
        }
    }

    render(): ReactNode {
        return (
            <div id="spaceselect">
                <select onChange={this.handleSelectChange}>
                    {this.state.spaces.map((spaceName: string) => (
                        <option key={spaceName} value={spaceName}>
                            {spaceName}
                        </option>
                    ))}
                </select>
            </div>
        );
    }
}