/****************************************************************************
 * Copyright 2017 EPAM Systems
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ***************************************************************************/

import { h, Component } from 'preact';
/** @jsx h */

class OpenButton extends Component {
	constructor(props) {
		super(props);
		if (props.server) {
			fileOpener(props.server).then(opener => {
				this.setState({opener});
			});
		}
	}

	open(ev) {
		const files = ev.target.files;
		const noop = () => null;
		const { onLoad = noop, onError = noop } = this.props;

		if (this.state.opener && files.length) {
			this.state.opener(files[0]).then(onLoad, onError);
		} else if (files.length)
			onLoad(files[0]);
		ev.target.value = null;
		ev.preventDefault();
	}

	render() {
		const { children, type, ...props } = this.props;

		return (
			<div { ...props }>
				<input id="input-file" onChange={ ev => this.open(ev) }
					   accept={ type } type="file"/>
				<label for="input-file">
					{ children }
				</label>
			</div>
		);
	}
}

function fileOpener (server) {
	return new Promise((resolve, reject) => {
		// TODO: refactor return
		if (global.FileReader)
			resolve(throughFileReader);

		else if (global.ActiveXObject) {
			try {
				const fso = new ActiveXObject('Scripting.FileSystemObject');
				resolve(file => Promise.resolve(throughFileSystemObject(fso, file)));
			} catch (e) {
				reject(e);
			}
		} else if (server) {
			resolve(server.then(() => {
				throw "Server doesn't still support echo method";
				//return resolve(throughForm2IframePosting);
			}));
		} else
			reject(new Error("Your browser does not support "  +
							 "opening files locally"));
	});
}

function throughFileReader(file) {
	return new Promise((resolve, reject) => {
		const rd = new FileReader();

		rd.onload = () => {
			const content = rd.result;
			if (file.msClose)
				file.msClose();
			resolve(content);
		};

		rd.onerror = event => {
			reject(event);
		};

		rd.readAsText(file, 'UTF-8');
	});
}

function throughFileSystemObject(fso, file) {
	// IE9 and below
	const fd =  fso.OpenTextFile(file.name, 1),
	content = fd.ReadAll();
	fd.Close();
	return content;
}

export default OpenButton;
