gutil = require 'gulp-util'
webpack = require 'webpack'
browserify = require 'browserify'
source = require 'vinyl-source-stream'
fileinclude = require "gulp-file-include"
rename = require "gulp-rename"
replace = require 'gulp-replace'
concat = require "gulp-concat"
less = require "gulp-less"
sass = require 'gulp-sass'
autoprefixer = require 'autoprefixer-core'
postcss = require 'gulp-postcss'
classPrfx = require 'postcss-class-prefix'
svgo = require('gulp-svgmin')

connect = require "gulp-connect"
modRewrite = require "connect-modrewrite"
size = require "gulp-size"
zopfli = require "gulp-zopfli"
rm = require "gulp-rm"

rev = require "gulp-rev"
revReplace = require "gulp-rev-replace"
useref = require "gulp-useref"
filter = require "gulp-filter"
uglify = require "gulp-uglify"
csso = require "gulp-csso"

gulpfile_lib = require "./gulpfile_lib"
through = require "through2"

sourcemaps = require('gulp-sourcemaps')
notify = require("gulp-notify")
livereload = require 'gulp-livereload'

es = require('event-stream')

proxies_settings = {
  "search_server": "http://www.jetradar.com"
}

module.exports = (gulp, config) ->
  gulpsync = require("gulp-sync")(gulp)

  gulp.task 'webpack', (callback) ->
    webpack require('./webpack.config'), (err, stats) ->
      if err
        throw new gutil.PluginError("webpack", err)
      gutil.log("[webpack]", stats.toString())
      callback()

  gulp.task "html", ->
    gulp.src(['app/index.html', 'app/clicks.html'])
    .pipe fileinclude(
      context:
        locale: config.locale
    )
    .pipe gulpfile_lib.transform_html_source(config.css_prefix)
    .pipe gulpfile_lib.translate("./config/locales/#{config.locale}.yml", config.locale)
    .pipe replace(/%LOCALE%/g, config.locale)
    .pipe rename (path) ->
      path.basename += '.' + config.locale
      path
    .pipe gulp.dest(config.paths.build_dir)

  gulp.task "images", ->
    gulp.src(config.paths.images)
    .pipe rename((path) -> path.dirname = '')
    .pipe gulpfile_lib.prepare_localized_file(config.locale)
    .pipe gulp.dest("#{config.paths.build_dir}/images")

  gulp.task "icons", ->
    gulp.src(config.paths.icons)
    .pipe gulpfile_lib.generate_css_icon()
    .pipe concat('icons.scss')
    .pipe gulp.dest('app/common/styles')

  gulp.task "font", ->
    gulp.src(config.paths.font)
    .pipe gulp.dest(config.paths.build_dir)

  gulp.task "watch", ->
    livereload.listen()
    gulp.watch(config.paths.html, ['html'])
    gulp.watch(config.paths.styles, ['styles'])
    gulp.watch(config.paths.images, ['images'])
    gulp.watch(config.paths.build_dir + '/main.css', livereload.changed)

  gulp.task "styles", ->
    gulp.src(config.styles_to_build)
    .pipe(gulpfile_lib.translate("./config/locales/#{config.locale}.yml", false, config.locale))
    .pipe(sourcemaps.init())
    .pipe(sass().on('error', sass.logError))
    .pipe postcss [
      autoprefixer {browsers: ['last 2 versions', 'ie 9', 'ie 10']}
    ]
    .pipe concat('main.css')
    .pipe sourcemaps.write('.', {includeContent: true})
    .pipe gulp.dest(config.paths.build_dir)

  gulp.task "do_minify", ->
    jsFilter = filter("**/*.js")
    cssFilter = filter("**/*.css")
    noFontsFilter = filter(["!**/*.woff", "!**/*.svg", "!**/*.ttf", "!**/*eot"])
    indexFilter = filter('index.*-*.html')

    gulp.src(["#{config.paths.build_dir}/**/*.*", "!#{config.paths.build_dir}**.map"])
    .pipe sourcemaps.init({loadMaps: true})
    .pipe jsFilter
    .pipe uglify()
    .pipe jsFilter.restore()
    .pipe cssFilter
    .pipe csso()
    .pipe cssFilter.restore()
    .pipe rev()
    .pipe noFontsFilter
    .pipe useref()
    .pipe noFontsFilter.restore()
    .pipe revReplace({prefix: '/new_searches'})
    .pipe sourcemaps.write('./')
    .pipe gulp.dest(config.paths.build_dir)
    .pipe indexFilter
    .pipe rename (path) ->
      path.basename = path.basename.replace(/\-.+$/, '')
      path
    .pipe indexFilter.restore()
    .pipe gulp.dest(config.paths.build_dir)

  gulp.task "compress", ->
    gulp.src(["#{config.paths.build_dir}/*-*.js"
              "#{config.paths.build_dir}/*-*.css"
              "#{config.paths.build_dir}/*-*.html"])
    .pipe zopfli(format: 'gzip')
    .pipe size(showFiles: true)
    .pipe gulp.dest(config.paths.build_dir)

  gulp.task "cleanup", ->
    gulp.src("#{config.paths.build_dir}/**/*", {read: false})
    .pipe rm()

  cors = (req, res, next) ->
    res.setHeader('Access-Control-Allow-Origin', '*')
    res.setHeader('Access-Control-Allow-Headers', '*')
    next()


  gulp.task "connect", ->
    connect.server({
      root: config.paths.build_dir
      host: "0.0.0.0"
      port: config.port
      middleware: -> (if config.stub isnt false then [gulpfile_lib.debug_middleware] else []).concat([
        modRewrite([
          "^/autocomplete/places(.*) http://www.jetradar.com/autocomplete/places$1 [P]"
          "^/[a-zA-Z0-9-/]+([?].*)?$ /index.#{config.locale}.html"
          "^/new_adaptors/(.*)$ #{proxies_settings.search_server}/new_adaptors/$1 [P]"
          "^/searches/(.*)/clicks/(.*).html?(.*)$ http://localhost:8080/clicks.#{config.locale}.html [P]"
          "^/searches/(.*)$ #{proxies_settings.search_server}/searches/$1 [P]"
          "^/(new_searches_results.*)$ #{proxies_settings.search_server}/$1 [P]"
          "^/(debug_info.*)$ #{proxies_settings.search_server}/$1 [P]"
          "^/(week_minimal_prices.*)$ http://search.aviasales.ru/$1 [P]"
        ])
      ]).concat(cors)
    })


  gulp.task 'build', ['html', 'styles', 'images', 'font']

  gulp.task 'minify', gulpsync.sync(['cleanup', 'build', 'do_minify', 'compress'])
