'use strict'

var os = require('os')
var gulp = require('gulp')
var gutil = require('gulp-util')
var sass = require('gulp-ruby-sass')
var jshint = require('gulp-jshint')
var uglify = require('gulp-uglifyjs')
var rename = require('gulp-rename')
var concat = require('gulp-concat')
var notify = require('gulp-notify')
var header = require('gulp-header')
var minifycss = require('gulp-minify-css')
// var jsdoc        = require("gulp-jsdoc");
// var jsdoc2md     = require("gulp-jsdoc-to-markdown");
var pkg = require('./package.json')
var dateFormat = require('dateformatter').format
var replace = require('gulp-replace')

pkg.name = 'Editor.md'
pkg.today = dateFormat

var headerComment = ['/*',
  ' * <%= pkg.name %>',
  ' *',
  ' * @file        <%= fileName(file) %> ',
  ' * @version     v<%= pkg.version %> ',
  ' * @description <%= pkg.description %>',
  ' * @license     MIT License',
  ' * @author      <%= pkg.author %>',
  ' * {@link       <%= pkg.homepage %>}',
  " * @updateTime  <%= pkg.today('Y-m-d') %>",
  ' */',
  '\r\n'].join('\r\n')

var headerMiniComment = "/*! <%= pkg.name %> v<%= pkg.version %> | <%= fileName(file) %> | <%= pkg.description %> | MIT License | By: <%= pkg.author %> | <%= pkg.homepage %> | <%=pkg.today('Y-m-d') %> */\r\n"

var scssTask = function (fileName, path) {
  path = path || 'scss/'

  var distPath = 'css'

  return sass(path + fileName + '.scss', { style: 'expanded', sourcemap: false, noCache: true })
    .pipe(gulp.dest(distPath))
    .pipe(header(headerComment, {pkg: pkg,
      fileName: function (file) {
        var name = file.path.split(file.base)
        return name[1].replace('\\', '')
      }}))
    .pipe(gulp.dest(distPath))
    .pipe(rename({ suffix: '.min' }))
    .pipe(gulp.dest(distPath))
    .pipe(minifycss())
    .pipe(gulp.dest(distPath))
    .pipe(header(headerMiniComment, {pkg: pkg,
      fileName: function (file) {
        var name = file.path.split(file.base)
        return name[1].replace('\\', '')
      }}))
    .pipe(gulp.dest(distPath))
    .pipe(notify({ message: fileName + '.scss task completed!' }))
}

gulp.task('scss', function () {
  return scssTask('editormd')
})

gulp.task('scss2', function () {
  return scssTask('editormd.preview')
})

gulp.task('scss3', function () {
  return scssTask('editormd.logo')
})

gulp.task('js', function () {
  return gulp.src('./src/editormd.js')
    .pipe(jshint('./.jshintrc'))
    .pipe(jshint.reporter('default'))
    .pipe(header(headerComment, {pkg: pkg,
      fileName: function (file) {
        var name = file.path.split(file.base)
        return name[1].replace(/[\\\/]?/, '')
      }}))
    .pipe(gulp.dest('./'))
    .pipe(rename({ suffix: '.min' }))
    .pipe(uglify()) // {outSourceMap: true, sourceRoot: './'}
    .pipe(gulp.dest('./'))
    .pipe(header(headerMiniComment, {pkg: pkg,
      fileName: function (file) {
        var name = file.path.split(file.base + ((os.platform() === 'win32') ? '\\' : '/'))
        return name[1].replace(/[\\\/]?/, '')
      }}))
    .pipe(gulp.dest('./'))
    .pipe(notify({ message: 'editormd.js task complete' }))
})

gulp.task('amd', function () {
  var replaceText1 = [
    'var cmModePath  = "codemirror/mode/";',
    '            var cmAddonPath = "codemirror/addon/";',
    '',
    '            var codeMirrorModules = [',
    '                "jquery", "marked", "prettify",',
    '                "katex", "raphael", "underscore", "flowchart",  "jqueryflowchart",  "sequenceDiagram",',
    '',
    '                "codemirror/lib/codemirror",',
    '                cmModePath + "css/css",',
    '                cmModePath + "sass/sass",',
    '                cmModePath + "shell/shell",',
    '                cmModePath + "sql/sql",',
    '                cmModePath + "clike/clike",',
    '                cmModePath + "php/php",',
    '                cmModePath + "xml/xml",',
    '                cmModePath + "markdown/markdown",',
    '                cmModePath + "javascript/javascript",',
    '                cmModePath + "htmlmixed/htmlmixed",',
    '                cmModePath + "gfm/gfm",',
    '                cmModePath + "http/http",',
    '                cmModePath + "go/go",',
    '                cmModePath + "dart/dart",',
    '                cmModePath + "coffeescript/coffeescript",',
    '                cmModePath + "nginx/nginx",',
    '                cmModePath + "python/python",',
    '                cmModePath + "perl/perl",',
    '                cmModePath + "lua/lua",',
    '                cmModePath + "r/r", ',
    '                cmModePath + "ruby/ruby", ',
    '                cmModePath + "rst/rst",',
    '                cmModePath + "smartymixed/smartymixed",',
    '                cmModePath + "vb/vb",',
    '                cmModePath + "vbscript/vbscript",',
    '                cmModePath + "velocity/velocity",',
    '                cmModePath + "xquery/xquery",',
    '                cmModePath + "yaml/yaml",',
    '                cmModePath + "erlang/erlang",',
    '                cmModePath + "jade/jade",',
    '',
    '                cmAddonPath + "edit/trailingspace", ',
    '                cmAddonPath + "dialog/dialog", ',
    '                cmAddonPath + "search/searchcursor", ',
    '                cmAddonPath + "search/search", ',
    '                cmAddonPath + "scroll/annotatescrollbar", ',
    '                cmAddonPath + "search/matchesonscrollbar", ',
    '                cmAddonPath + "display/placeholder", ',
    '                cmAddonPath + "edit/closetag", ',
    '                cmAddonPath + "fold/foldcode",',
    '                cmAddonPath + "fold/foldgutter",',
    '                cmAddonPath + "fold/indent-fold",',
    '                cmAddonPath + "fold/brace-fold",',
    '                cmAddonPath + "fold/xml-fold", ',
    '                cmAddonPath + "fold/markdown-fold",',
    '                cmAddonPath + "fold/comment-fold", ',
    '                cmAddonPath + "mode/overlay", ',
    '                cmAddonPath + "selection/active-line", ',
    '                cmAddonPath + "edit/closebrackets", ',
    '                cmAddonPath + "display/fullscreen",',
    '                cmAddonPath + "search/match-highlighter"',
    '            ];',
    '',
    '            define(codeMirrorModules, factory);'
  ].join('\r\n')

  var replaceText2 = [
    'if (typeof define == "function" && define.amd) {',
    '       $          = arguments[0];',
    '       marked     = arguments[1];',
    '       prettify   = arguments[2];',
    '       katex      = arguments[3];',
    '       Raphael    = arguments[4];',
    '       _          = arguments[5];',
    '       flowchart  = arguments[6];',
    '       CodeMirror = arguments[9];',
    '   }'
  ].join('\r\n')

  gulp.src('src/editormd.js')
    .pipe(rename({ suffix: '.amd' }))
    .pipe(gulp.dest('./'))
    .pipe(header(headerComment, {pkg: pkg,
      fileName: function (file) {
        var name = file.path.split(file.base)
        return name[1].replace(/[\\\/]?/, '')
      }}))
    .pipe(gulp.dest('./'))
    .pipe(replace('/* Require.js define replace */', replaceText1))
    .pipe(gulp.dest('./'))
    .pipe(replace('/* Require.js assignment replace */', replaceText2))
    .pipe(gulp.dest('./'))
    .pipe(rename({ suffix: '.min' }))
    .pipe(uglify()) // {outSourceMap: true, sourceRoot: './'}
    .pipe(gulp.dest('./'))
    .pipe(header(headerMiniComment, {pkg: pkg,
      fileName: function (file) {
        var name = file.path.split(file.base + ((os.platform() === 'win32') ? '\\' : '/'))
        return name[1].replace(/[\\\/]?/, '')
      }}))
    .pipe(gulp.dest('./'))
    .pipe(notify({ message: 'amd version task complete'}))
})

var codeMirror = {
  path: {
    src: {
      mode: 'lib/codemirror/mode',
      addon: 'lib/codemirror/addon'
    },
    dist: 'lib/codemirror'
  },
  modes: [
    'css',
    'sass',
    'shell',
    'sql',
    'clike',
    'php',
    'xml',
    'markdown',
    'javascript',
    'htmlmixed',
    'gfm',
    'http',
    'go',
    'dart',
    'coffeescript',
    'nginx',
    'python',
    'perl',
    'lua',
    'r',
    'ruby',
    'rst',
    'smartymixed',
    'vb',
    'vbscript',
    'velocity',
    'xquery',
    'yaml',
    'erlang',
    'jade'
  ],

  addons: [
    'edit/trailingspace',
    'dialog/dialog',
    'search/searchcursor',
    'search/search',
    'scroll/annotatescrollbar',
    'search/matchesonscrollbar',
    'display/placeholder',
    'edit/closetag',
    'fold/foldcode',
    'fold/foldgutter',
    'fold/indent-fold',
    'fold/brace-fold',
    'fold/xml-fold',
    'fold/markdown-fold',
    'fold/comment-fold',
    'mode/overlay',
    'selection/active-line',
    'edit/closebrackets',
    'display/fullscreen',
    'search/match-highlighter'
  ]
}

gulp.task('cm-mode', function () {
  var modes = [
    codeMirror.path.src.mode + '/meta.js'
  ]

  for (var i in codeMirror.modes) {
    var mode = codeMirror.modes[i]
    modes.push(codeMirror.path.src.mode + '/' + mode + '/' + mode + '.js')
  }

  return gulp.src(modes)
    .pipe(concat('modes.min.js'))
    .pipe(gulp.dest(codeMirror.path.dist))
    .pipe(uglify()) // {outSourceMap: true, sourceRoot: codeMirror.path.dist}
    .pipe(gulp.dest(codeMirror.path.dist))
    .pipe(header(headerMiniComment, {pkg: pkg,
      fileName: function (file) {
        var name = file.path.split(file.base + '\\')
        return (name[1] ? name[1] : name[0]).replace(/\\/g, '')
      }}))
    .pipe(gulp.dest(codeMirror.path.dist))
    .pipe(notify({ message: 'codemirror-mode task complete!' }))
})

gulp.task('cm-addon', function () {
  var addons = []

  for (var i in codeMirror.addons) {
    var addon = codeMirror.addons[i]
    addons.push(codeMirror.path.src.addon + '/' + addon + '.js')
  }

  return gulp.src(addons)
    .pipe(concat('addons.min.js'))
    .pipe(gulp.dest(codeMirror.path.dist))
    .pipe(uglify()) // {outSourceMap: true, sourceRoot: codeMirror.path.dist}
    .pipe(gulp.dest(codeMirror.path.dist))
    .pipe(header(headerMiniComment, {pkg: pkg,
      fileName: function (file) {
        var name = file.path.split(file.base + '\\')
        return (name[1] ? name[1] : name[0]).replace(/\\/g, '')
      }}))
    .pipe(gulp.dest(codeMirror.path.dist))
    .pipe(notify({ message: 'codemirror-addon.js task complete' }))
})
/*
gulp.task("jsdoc", function(){
    return gulp.src(["./src/editormd.js", "README.md"])
               .pipe(jsdoc.parser())
               .pipe(jsdoc.generator("./docs/html"));
});

gulp.task("jsdoc2md", function() {
    return gulp.src("src/js/editormd.js")
            .pipe(jsdoc2md())
            .on("error", function(err){
                gutil.log(gutil.colors.red("jsdoc2md failed"), err.message);
            })
            .pipe(rename(function(path) {
                path.extname = ".md";
            }))
            .pipe(gulp.dest("docs/markdown"));
});
*/
gulp.task('watch', function () {
  gulp.watch('scss/editormd.scss', ['scss'])
  gulp.watch('scss/editormd.preview.scss', ['scss', 'scss2'])
  gulp.watch('scss/editormd.logo.scss', ['scss', 'scss3'])
  gulp.watch('src/editormd.js', ['js', 'amd'])
})

gulp.task('default', function () {
  gulp.run('scss')
  gulp.run('scss2')
  gulp.run('scss3')
  gulp.run('js')
  gulp.run('amd')
  gulp.run('cm-addon')
  gulp.run('cm-mode')
})
