module.exports = (grunt) ->

	# Project configuration
	grunt.initConfig
		pkg: grunt.file.readJSON('package.json')

		env:
			prod:
				NODE_ENV: 'production'
			dev:
				NODE_ENV: 'development'
		browserify:
			options:
				paths: [
					'../node_modules'
				]
				transform: [
					[
						'babelify'
						{
							presets: ['env', 'react']
							plugins: ['add-module-exports', 'transform-class-properties', 'transform-object-rest-spread']
						}
					]
					[
						'extensify'
						{
							extensions: ['jsx']
						}
					]
				]
				browserifyOptions:
					standalone: 'ScoutDocsApp'
					debug: yes
			dev:
				files:
					'js/scoutdocs.min.js': 'js/scoutdocs.jsx'
					'js/support.min.js': 'js/support.jsx'
			prod:
				files:
					'js/scoutdocs.min.js': 'js/scoutdocs.jsx'
					'js/support.min.js': 'js/support.jsx'
				options:
					browserifyOptions:
						standalone: 'ScoutDocsApp'
						debug: no
					transform: [
						[
							'envify'
							{
								global: yes
							}
						]
						[
							'babelify'
							{
								presets: ['env', 'react']
								plugins: ['add-module-exports', 'transform-class-properties', 'transform-object-rest-spread']
							}
						]
						[
							'extensify'
							{
								extensions: ['jsx']
							}
						]
						[
							'uglifyify'
							{
								global: yes
							}
						]
					]

		sass:
			default:
				options:
					style: 'expanded'
				files:
					'css/scoutdocs.css': 'sass/scoutdocs.sass'
					'css/app.css': 'sass/app.sass'

		postcss:
			dev:
				src: 'css/*.css'
				options:
					map: yes
					processors: [
						require 'autoprefixer'
					]
			prod:
				src: 'css/*.css'
				options:
					map: yes
					processors: [
						require 'autoprefixer'
						require 'cssnano'
					]

		phpunit:
			default: {}

		watch:
			php:
				files: [
					'**/*.php'
					'!release/**'
					'!node_modules/**'
					'!.git/**'
					'!.sass-cache/**'
				]
				tasks: [ 'phpunit' ]
				options:
					debounceDelay: 5000
			sass:
				files: [
					'sass/*.sass'
					'!release/**'
					'!node_modules/**'
					'!.git/**'
					'!.sass-cache/**'
				]
				tasks: [
					'sass'
					'postcss:dev'
				]
				options:
					debounceDelay: 500
			jsx:
				files: [
					'js/*.jsx'
					'js/**/*.jsx'
					'!release/**'
					'!node_modules/**'
					'!.git/**'
					'!.sass-cache/**'
				]
				tasks: [
					'browserify:dev'
				]
				options:
					debounceDelay: 500

		clean:
			release: [
				'release/<%= pkg.version %>/'
				'release/latest/'
				'release/svn/'
			]

		copy:
			main:
				src: [
					'**'
					'!node_modules/**'
					'!release/**'
					'!assets/**'
					'!.git/**'
					'!.sass-cache/**'
					'!img/src/**'
					'!Gruntfile.*'
					'!package.json'
					'!package-lock.json'
					'!js/fa/bundles/**'
					'!js/fa/packs/**'
					'js/fa/packs/*.min.js'
					'!js/fa/*.js'
					'js/fa/*.min.js'
					'!yarn.lock'
					'!sass/**'
					'!js/support.js'
					'!js/components/**'
					'!js/*.map'
					'!.gitignore'
					'!.gitmodules'
					'!tests/**'
					'!bin/**'
					'!.travis.yml'
					'!phpunit.xml'
					'!js/*.jsx'
					'!js/utils/**'
					'!css/*.map'
				]
				dest: 'release/<%= pkg.version %>/'
			latest:
				cwd: 'release/<%= pkg.version %>/'
				src: ['**']
				dest: 'release/latest/'
			wp:
				src: [
					'**'
					'!assets/**',
					'!node_modules/**'
					'!release/**'
					'!.git/**'
					'!.sass-cache/**'
					'!.gitignore'
					'!.gitmodules'
					'!tests/**'
					'!bin/**'
					'!.travis.yml'
					'!phpunit.xml'
					'!lib/EDD_SL_Plugin_Updater.php'
				]
				dest: 'release/svn/'

		replace:
			header:
				src: [ '<%= pkg.name %>.php' ]
				overwrite: yes
				replacements: [
					from: /Version:(\s*?)[a-zA-Z0-9.-]+$/m
					to: 'Version:$1<%= pkg.version %>'
				]
			plugin:
				src: [ 'classes/plugin.php' ]
				overwrite: yes
				replacements: [
					from: /^(\s*?)const(\s+?)VERSION(\s*?)=(\s+?)'[^']+';/m
					to: "$1const$2VERSION$3=$4'<%= pkg.version %>';"
				,
					from: /^(\s*?)const(\s+?)CSS_JS_VERSION(\s*?)=(\s+?)'[^']+';/m
					to: "$1const$2CSS_JS_VERSION$3=$4'<%= pkg.version %>';"
				]
			wp:
				src: [ 'release/svn/<%= pkg.name %>.php' ]
				overwrite: yes
				replacements: [
					from: /define\( 'SCOUTDOCS_SELF_PACKAGE', true \);/m
					to: "define( 'SCOUTDOCS_SELF_PACKAGE', false );"
				]

		compress:
			default:
				options:
					mode: 'zip'
					archive: './release/<%= pkg.name %>.<%= pkg.version %>.zip'
				expand: yes
				cwd: 'release/<%= pkg.version %>/'
				src: [ '**/*' ]
				dest: '<%= pkg.name %>/'
			wp:
				options:
					mode: 'zip'
					archive: './release/<%= pkg.name %>.<%= pkg.version %>.wordpress.org.zip'
				expand: yes
				cwd: 'release/svn/'
				src: [
					'**/*'
					'!assets/**'
				]
				dest: '<%= pkg.name %>/'


		notify_hooks:
			options:
				success: yes

		prettier:
			options:
				singleQuote: yes
				useTabs: yes
				trailingComma: 'es5'
			default:
				src: [
					'js/components/**.jsx'
				]

		wp_deploy:
			deploy:
				options:
					plugin_slug: '<%= pkg.name %>'
					svn_user: '<%= pkg.name %>'
					build_dir: 'release/svn'
					assets_dir: 'assets'

	# Load other tasks
	grunt.loadNpmTasks 'grunt-browserify'
	grunt.loadNpmTasks 'grunt-contrib-concat'
	grunt.loadNpmTasks 'grunt-contrib-sass'
	grunt.loadNpmTasks 'grunt-contrib-watch'
	grunt.loadNpmTasks 'grunt-contrib-clean'
	grunt.loadNpmTasks 'grunt-contrib-copy'
	grunt.loadNpmTasks 'grunt-contrib-compress'
	grunt.loadNpmTasks 'grunt-postcss'
	grunt.loadNpmTasks 'grunt-text-replace'
	grunt.loadNpmTasks 'grunt-phpunit'
	grunt.loadNpmTasks 'grunt-env'
	grunt.loadNpmTasks 'grunt-notify'
	grunt.loadNpmTasks 'grunt-prettier'
	grunt.loadNpmTasks 'grunt-wp-deploy'

	grunt.task.run 'notify_hooks'

	# Default task
	grunt.registerTask 'default', [
		'env:dev'
		'replace:header'
		'replace:plugin'
		'browserify:dev'
		'sass'
		'postcss:dev'
	]

	# Default prod task
	grunt.registerTask 'default:prod', [
		'env:prod'
		'replace:header'
		'replace:plugin'
		'browserify:prod'
		'sass'
		'postcss:prod'
	]

	# Build task
	grunt.registerTask 'build', [
		'default:prod'
		'clean'
		'copy:main'
		'copy:latest'
		'copy:wp'
		'replace:wp'
		'compress'
	]

	# Release task
	grunt.registerTask 'release', [
		'build'
		'wp_deploy'
	]

	grunt.util.linefeed = '\n'
