import Loader from 'trc-client-core/src/components/Loader';
import React from 'react';
import {List} from 'immutable';
import UserStore from 'trc-client-core/src/user/UserStore';
import {connect} from 'react-redux';
import {requestPrerequisiteGet} from 'trc-client-core/src/course/PrerequisiteDuck';
import {
    courseParticipationRequest,
    requestCourse,
    requestCourseListSimilar
} from 'trc-client-core/src/course/CourseActions';



var SingleCourseHandler = React.createClass({
    displayName: 'SingleCourseHandler',
    componentWillReceiveProps(nextProps) {
        var {params} = this.props;
        if(params.id !== nextProps.params.id) {
            this.fetchData(nextProps);
        }
    },
    componentDidMount() {
        this.fetchData(this.props);
    },
    fetchData(props) {
        var {dispatch} = props;
        dispatch(requestCourse(props.params.id));
        dispatch(requestCourseListSimilar({courseCode: props.params.id }));
        dispatch(requestPrerequisiteGet(props.params.id))

        dispatch(courseParticipationRequest({
            courseCode: props.params.id,
            participantId: UserStore.get('participantId')
        }));
    },
    render: function () {
        if (!this.props.course || !this.props.similarCourses) {
            return <Loader/>;
        }

        return React.cloneElement(this.props.children, {
            course: this.props.course,
            similarCourses: this.props.similarCourses,
            prerequisite: this.props.prerequisite,
            fetchData: this.fetchData
        });
    }
});

export default connect(
    (state, props) => {
        function getByCourseCode(courseCode) {
            return state.course.getIn(['collection', courseCode]);
        }

        var course = getByCourseCode(props.params.id);
        var prerequisite = state.prerequisite.getIn(['collection', props.params.id]);

        if (course && prerequisite) {
            course = course.set('prerequisiteExpression', prerequisite.get('expression'))
        }

        return {
            course: course,
            prerequisite: prerequisite,
            similarCourses: (course) ? course.get('similarCourses').map(cc => getByCourseCode(cc)).toList() : List()
        }
    }
)(SingleCourseHandler);
