module Hauler
  module Generators
    #:nodoc:
    class InstallNpmGenerator < ::Rails::Generators::Base
      desc 'Setup hauler project'
      source_root File.expand_path('../templates', __FILE__)

      NPM_DEV_DEPENDENCIES = <<-TXT.freeze
        babel-core@6.11.4
        babel-loader@6.2.4
        babel-plugin-transform-class-properties@6.11.5
        babel-preset-es2015@6.9.0
        babel-preset-stage-2@6.11.0
        css-loader@0.23.1
        extract-text-webpack-plugin@1.0.1
        file-loader@0.9.0
        image-webpack-loader@2.0.0
        immutable-devtools@0.0.7
        style-loader@0.13.1
        url-loader@0.5.7
        webpack@1.13.1
        webpack-dev-server@1.14.1
      TXT

      LINTER_DEV_DEPENDENCES = <<-TXT.freeze
        babel-eslint@6.1.2
        eslint@2.13.1
        eslint-config-airbnb@9.0.1
        eslint-import-resolver-webpack@0.4.0
        eslint-plugin-flow-vars@0.5.0
        eslint-plugin-import@1.12.0
        eslint-plugin-jsx-a11y@1.5.5
        eslint-plugin-react@5.2.2
        sass-lint@1.8.2
      TXT

      REACT_NPM_DEV_DEPENDENCIES = <<-TXT.freeze
        babel-plugin-transform-react-constant-elements@6.9.1
        babel-plugin-transform-react-inline-elements@6.8.0
        babel-plugin-transform-react-remove-prop-types@0.2.8
        babel-preset-react@6.11.1
        react-hot-loader@2.0.0-alpha-4
        redux-logger@2.6.1
      TXT

      REACT_NPM_DEPENDENCIES = <<-TXT.freeze
        immutable@3.8.1
        react@15.2.1
        react-dom@15.2.1
        react-redux@4.4.5
        react-router@2.6.1
        react-router-redux@4.0.5
        react-router-scroll@0.2.1
        redux@3.5.2
        redux-immutable@3.0.6
        redux-saga@0.11.0
        reselect@2.5.3
      TXT

      SASS_NPM_DEV_DEPENDENCIES = <<-TXT.freeze
        node-sass@3.8.0
        sass-loader@4.0.0
      TXT

      NPM_DEPENDENCIES = <<-TXT.freeze
        babel-polyfill@6.9.1
        whatwg-fetch@1.0.0
      TXT

      def add_scripts_to_package
        `./node_modules/hauler/bin/update-scripts.js`
      end

      def install_dev_dependencies
        puts 'Installing NPM dev dependencies...'
        install_deps(NPM_DEV_DEPENDENCIES)
      end

      def install_linter_dev_dependencies
        puts 'Installing Linter NPM dev dependencies...'
        install_deps(LINTER_DEV_DEPENDENCES)
      end

      def install_react_dependencies
        puts 'Installing React NPM dev dependencies...'
        install_deps(REACT_NPM_DEV_DEPENDENCIES)

        puts 'Installing React NPM dependencies...'
        install_deps(REACT_NPM_DEPENDENCIES, dev: false)
      end

      def install_sass_dependencies
        puts 'Installing Sass NPM dependencies...'
        install_deps(SASS_NPM_DEV_DEPENDENCIES)
      end

      def install_dependencies
        puts 'Installing NPM dependencies...'
        install_deps(NPM_DEPENDENCIES, dev: false)
      end

      private

      def install_deps(list, dev: true)
        flag = dev ? '--save-dev' : '--save'
        `npm install #{flag} #{list.gsub(/\s+/m, ' ')}`
      end
    end
  end
end