import React, { createRef } from "react";
import { Input, Button, Container, Icon, NgIf, Loader, CSSTransition } from "../../components/";
import { Config, Admin } from "../../model/";
import { notify, FormObjToJSON, alert, prompt } from "../../helpers";
import { bcrypt_password } from "../../helpers/bcrypt";
//import ReactCSSTransitionGroup from "react-addons-css-transition-group";
import "./setup.scss";
export class SetupPage extends React.Component {
    constructor(props){
        super(props);
        this.state = {
            busy: false,
        };
    }
    componentDidMount() {
        const start = (e) => {
            e.preventDefault();
            this.props.history.push("/");
        };
        Config.all().then((config) => {
            if(config.log.telemetry.value === true) return;
            this.unlisten = this.props.history.listen((location, action) => {
                this.unlisten();
                alert.now((
                    
                      
                        Help making this software better by sending crash reports and anonymous usage statistics
                      
                      
                     
                ));
            });
        });
    }
    onAdminPassword(p, done){
        this.setState({busy: true});
        Config.all().then((config) => {
            return bcrypt_password(p).then((hash) => {
                config = FormObjToJSON(config);
                config.connections = window.CONFIG.connections;
                config.auth.admin = hash;
                Config.save(config, false)
                    .then(() => Admin.login(p))
                    .then(() => this.setState({busy: false}, done))
                    .catch((err) => {
                        this.setState({busy: false});
                        notify.send(err && err.message, "error");
                    });
            }).catch((err) => {
                this.setState({busy: false});
                notify.send("Hash error: " + JSON.stringify(err), "error");
            });
        }).catch((err) => {
            notify.send(err && err.message, "error");
            this.setState({busy: false});
        });
    }
    enableLog(value){
        Config.all().then((config) => {
            config = FormObjToJSON(config);
            config.connections = window.CONFIG.connections;
            config.log.telemetry = value;
            Config.save(config, false);
        });
    };
    summaryCall(){
        this.setState({busy: true});
        return Config.all().then((config) => {
            this.setState({busy: false});
            return [
                {
                    "name_success": "SSL is configured properly",
                    "name_failure": "SSL is not configured properly",
                    "pass": window.location.protocol !== "http:",
                    "severe": true,
                    "message": "This can lead to data leaks. Please use a SSL certificate"
                }, {
                    "name_success": "Application is running as '" + objectGet(config, ["constant", "user", "value"]) + "'",
                    "name_failure": "Application is running as root",
                    "pass": objectGet(config, ["constant", "user", "value"]) !== "root",
                    "severe": true,
                    "message": "This is dangerous, you should use another user with less privileges"
                }, {
                    "name_success": "Emacs is installed",
                    "name_failure": "Emacs is not installed",
                    "pass": objectGet(config, ["constant", "emacs", "value"]),
                    "severe": false,
                    "message": "If you want to use all the org-mode features of Filestash, you need to install emacs"
                }, {
                    "name_success": "Pdftotext is installed",
                    "name_failure": "Pdftotext is not installed",
                    "pass": objectGet(config, ["constant", "pdftotext", "value"]),
                    "severe": false,
                    "message": "You won't be able to search through PDF documents without it"
                }
            ];
        }).catch((err) => {
            notify.send(err && err.message, "error");
            this.setState({busy: false});
        });
    }
    render(){
        return (
            
              
            
        );
    }
}
class MultiStepForm extends React.Component {
    constructor(props){
        super(props);
        this.state = {
            current: parseInt(window.location.hash.replace("#", "")) || 0,
            answer_password: "",
            has_answered_password: false,
            deps: []
        };
        this.$input = createRef()
    }
    componentDidMount(){
        if(this.state.current === 1){
            this.props.summaryCall().then((deps) => {
                this.setState({deps: deps});
            });
        }
    }
    onAdminPassword(e){
        e.preventDefault();
        this.props.onAdminPassword(this.state.answer_password, () => {
            this.setState({has_answered_password: true});
            this.onStepChange(1);
        });
    }
    onStepChange(n){
        this.setState({current: n}, () => {
            if(n === 1) this.componentDidMount();
        });
    }
    render() {
        const hideMenu = ;
        if(this.state.current === 0) {
            return (
                
                  
                    Admin Password
                  
                  
                    
                      Create your instance admin password: 
                      
                     
                  
                {hideMenu}
                
 
            );
        } else if(this.state.current === 1) {
            return (
                
                  
                    Summary
                  
                  
                    
                      
                        
                        Verifying
                      
                      
                        {
                            this.state.deps.map((dep, idx) => {
                                return (
                                    
                                      {dep.pass ? dep.name_success : dep.name_failure}{dep.pass ? null : ": " + dep.message}
                                    
                                );
                            })
                        }
                      
                     
                  
                 
            );
        }
        return null;
    }
}
const FormStage = (props) => {
    return (
        
          { props.navleft === true ?  props.onStepChange(props.current - 1)}/> : null}
          { props.children }
          { props.navright === true ?  props.onStepChange(props.current + 1)}/> : null }
        
    );
};
function objectGet(obj, paths){
    let value = obj;
    for(let i=0; i