/*!
 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
 *
 * 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 React from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import Input from 'nfvo-components/input/validation/InputWrapper.jsx';

import LicenseModelActionHelper from './onboarding/licenseModel/LicenseModelActionHelper.js';
import LicenseAgreementListEditor from './onboarding/licenseModel/licenseAgreement/LicenseAgreementListEditor.js';
import LicenseAgreementActionHelper from './onboarding/licenseModel/licenseAgreement/LicenseAgreementActionHelper.js';
import FeatureGroupListEditor from './onboarding/licenseModel/featureGroups/FeatureGroupListEditor.js';
import FeatureGroupsActionHelper from './onboarding/licenseModel/featureGroups/FeatureGroupsActionHelper.js';
import LicenseKeyGroupsListEditor from './onboarding/licenseModel/licenseKeyGroups/LicenseKeyGroupsListEditor.js';
import LicenseKeyGroupsActionHelper from './onboarding/licenseModel/licenseKeyGroups/LicenseKeyGroupsActionHelper.js';
import EntitlementPoolsListEditor from './onboarding/licenseModel/entitlementPools/EntitlementPoolsListEditor.js';
import EntitlementPoolsActionHelper from './onboarding/licenseModel/entitlementPools/EntitlementPoolsActionHelper.js';
import SoftwareProductLandingPage from './onboarding/softwareProduct/landingPage/SoftwareProductLandingPage.js';
import SoftwareProductDetails from './onboarding/softwareProduct/details/SoftwareProductDetails.js';
import Onboard from './onboarding/onboard/Onboard.js';
import SoftwareProductActionHelper from './onboarding/softwareProduct/SoftwareProductActionHelper.js';
import FlowsListEditor from './flows/FlowsListEditor.js';
import FlowsActions from './flows/FlowsActions.js';

const mapStateToProps = ({ licenseModelList }) => {
    return { licenseModelList };
};

const mapActionsToProps = dispatch => {
    return {
        onBootstrapped: () =>
            LicenseModelActionHelper.fetchLicenseModels(dispatch),
        onLicenseAgreementListEditor: licenseModelId =>
            LicenseAgreementActionHelper.fetchLicenseAgreementList(dispatch, {
                licenseModelId
            }),
        onFeatureGroupsListEditor: licenseModelId =>
            FeatureGroupsActionHelper.fetchFeatureGroupsList(dispatch, {
                licenseModelId
            }),
        onLicenseKeyGroupsListEditor: licenseModelId =>
            LicenseKeyGroupsActionHelper.fetchLicenseKeyGroupsList(dispatch, {
                licenseModelId
            }),
        onEntitlementPoolsListEditor: licenseModelId =>
            EntitlementPoolsActionHelper.fetchEntitlementPoolsList(dispatch, {
                licenseModelId
            }),
        onOnboardingCatalog: () =>
            SoftwareProductActionHelper.fetchSoftwareProductList(dispatch),
        onSoftwareProductDetails: () =>
            SoftwareProductActionHelper.fetchSoftwareProductCategories(
                dispatch
            ),
        onFlowsListEditor: () => FlowsActions.fetchFlows(dispatch)
    };
};

class ModuleOptions extends React.Component {
    static propTypes = {
        onBootstrapped: PropTypes.func.isRequired,
        onLicenseAgreementListEditor: PropTypes.func.isRequired,
        onFeatureGroupsListEditor: PropTypes.func.isRequired,
        onLicenseKeyGroupsListEditor: PropTypes.func.isRequired,
        onEntitlementPoolsListEditor: PropTypes.func.isRequired,
        onOnboardingCatalog: PropTypes.func.isRequired,
        onSoftwareProductDetails: PropTypes.func.isRequired
    };

    state = {
        currentModule: localStorage.getItem('default-module'),
        licenseModelId: localStorage.getItem('default-license-model-id')
    };

    componentDidMount() {
        this.props.onBootstrapped();
    }

    render() {
        let { currentModule, licenseModelId } = this.state;
        let { licenseModelList } = this.props;
        return (
            <div style={{ marginTop: 20 }}>
                <Input
                    name="licenseModel"
                    value={licenseModelId}
                    ref="licenseModelId"
                    type="select"
                    onChange={this.handleLicenseModelIdChange}
                    className="inner-pagination select-input">
                    <option value="" key={null}>
                        Select License Model
                    </option>
                    {licenseModelList.map(({ id, vendorName }) => (
                        <option
                            value={id}
                            key={id}>{`${vendorName} License Model`}</option>
                    ))}
                </Input>
                <Input
                    name="currentView"
                    value={currentModule}
                    ref="selectedModule"
                    type="select"
                    onChange={this.handleModuleSelection}
                    className="inner-pagination select-input">
                    <option value="">Select Module</option>
                    <option value="EntitlementPoolsListEditor">
                        Entitlement Pools
                    </option>
                    <option value="LicenseAgreementListEditor">
                        License Agreements
                    </option>
                    <option value="FutureGroupListEditor">
                        Feature Groups
                    </option>
                    <option value="LicenseKeyGroupsListEditor">
                        License Key Groups
                    </option>
                    <option value="SoftwareProductLanding">
                        Software Product Landing
                    </option>
                    <option value="SoftwareProductDetails">
                        Software Product Details
                    </option>
                    <option value="OnboardingCatalog">
                        Onboarding Catalog
                    </option>
                    <option value="Flows">Flows</option>
                </Input>
                <div
                    className="sub-module-view"
                    style={{
                        paddingTop: 10,
                        margin: 4,
                        borderTop: '1px solid silver'
                    }}>
                    {this.renderModule(currentModule)}
                </div>
            </div>
        );
    }

    renderModule(currentModule) {
        const { licenseModelId } = this.state;
        if (!licenseModelId) {
            return;
        }

        switch (currentModule) {
            case 'LicenseAgreementListEditor':
                this.props.onLicenseAgreementListEditor(licenseModelId);
                return (
                    <LicenseAgreementListEditor
                        licenseModelId={licenseModelId}
                    />
                );
            case 'FutureGroupListEditor':
                this.props.onFeatureGroupsListEditor(licenseModelId);
                return (
                    <FeatureGroupListEditor licenseModelId={licenseModelId} />
                );
            case 'EntitlementPoolsListEditor':
                this.props.onEntitlementPoolsListEditor(licenseModelId);
                return (
                    <EntitlementPoolsListEditor
                        licenseModelId={licenseModelId}
                    />
                );
            case 'LicenseKeyGroupsListEditor':
                this.props.onLicenseKeyGroupsListEditor(licenseModelId);
                return (
                    <LicenseKeyGroupsListEditor
                        licenseModelId={licenseModelId}
                    />
                );
            case 'SoftwareProductLanding':
                return (
                    <SoftwareProductLandingPage
                        licenseModelId={licenseModelId}
                    />
                );
            case 'SoftwareProductDetails':
                this.props.onSoftwareProductDetails(licenseModelId);
                return (
                    <SoftwareProductDetails licenseModelId={licenseModelId} />
                );
            case 'OnboardingCatalog':
                this.props.onOnboardingCatalog();
                return <Onboard />;
            case 'Flows':
                this.props.onFlowsListEditor();
                return <FlowsListEditor />;
            default:
                return;
        }
    }

    handleModuleSelection = () => {
        let selectedModule = this.refs.selectedModule.getValue();
        localStorage.setItem('default-module', selectedModule);
        this.setState({ currentModule: selectedModule });
    };

    handleLicenseModelIdChange = () => {
        let licenseModelId = this.refs.licenseModelId.getValue();
        localStorage.setItem('default-license-model-id', licenseModelId);
        this.setState({ licenseModelId });
    };
}

export default connect(mapStateToProps, mapActionsToProps)(ModuleOptions);