'use strict'

path   = require 'path'
CSON   = require 'season'
should = require 'should'
fs     = require 'fs-extra'
Bumped = require '../lib/Bumped'
pkg    = require '../package.json'

testPath = (filepath) -> path.resolve __dirname, filepath

bumpedFactory = (folderName) ->
  before (done) ->
    src = testPath "fixtures/#{folderName}"
    dest = testPath "#{folderName}"
    fs.copy src, dest, =>
      @bumped = new Bumped
        cwd: dest
        logger:
          color: true

      done()

  after (done) ->
    fs.remove testPath(folderName), done

describe 'Bumped ::', ->

  bumpedFactory 'sample_directory'

  describe 'init ::', ->
    it 'initialize a configuration file', (done) ->
      @bumped.init ->
        config = fs.readFileSync('.bumpedrc', encoding: 'utf8')
        config = CSON.parse config
        config.files.length.should.be.equal 2
        done()
  describe 'semver ::', ->
    describe 'version ::', ->
      it 'sync correctly the version between the files', ->
        @bumped.semver.version (version) ->
          version.should.be.equal('0.2.0')

    describe 'release ::', ->
      it 'try to release a new version that is not valid', (done) ->
        @bumped.semver.release version:null, (err, version) ->
          (err?).should.be.equal true
          done()

      it 'try to release a new version that is not valid string', (done) ->
        @bumped.semver.release version:'1.0', (err, version) ->
          (err?).should.be.equal true
          done()

      it 'try to release a new version that is a valid string but is not greater', (done) ->
        @bumped.semver.release version:'0.1.0', (err, version) ->
          (err?).should.be.equal true
          done()

      it 'releases a new version that is a valid based in a number', (done) ->
        @bumped.semver.release version:'1.0.0', (err, version) ->
          (err?).should.be.equal false
          version.should.be.equal('1.0.0')
          require('./sample_directory/bower.json').version.should.be.equal('1.0.0')
          done()

      it 'release a new version that is valid based in a semver keyword', (done) ->
        @bumped.semver.release version:'minor', (err, version) ->
          (err?).should.be.equal false
          version.should.be.equal('1.1.0')
          require('./sample_directory/bower.json').version.should.be.equal('1.1.0')
          done()
  describe 'config ::', ->
    describe 'add ::', ->
      it 'just add a file', (done) ->
        @bumped.config.add
          file: 'test.json'
          outputMessage: true
        , (err, files) ->
          files.length.should.be.equal 3
          done()

      it 'try to add a file that is already added', (done) ->
        @bumped.config.add
          file: 'test.json'
          outputMessage: true
        , (err, files) ->
          (err?).should.be.equal true
          files.length.should.be.equal 3
          done()

      it 'prevent add a file that doesn\'t exist in the directory', (done) ->
        @bumped.config.add
          file: 'testing.json'
          detect: true
          outputMessage: true
        , (err, files) ->
          (err?).should.be.equal true
          files.length.should.be.equal 3
          done()

      it 'add a file that exist in the directory and then save it', (done) ->
        @bumped.config.add
          file: 'component.json'
          detect: true
          outputMessage: true
          save: true
        , (err, files) ->
          (err?).should.be.equal false
          files.length.should.be.equal 4
          config = fs.readFileSync('.bumpedrc', encoding: 'utf8')
          config = CSON.parse config
          config.files.length.should.be.equal 4
          done()

    describe 'remove ::', ->
      it 'try to removed a file that doesn\'t exist', (done) ->
        @bumped.config.remove
          file: 'unicorn.json'
          outputMessage: true
          save: true
        , (err, files) ->
          (err?).should.be.equal true
          files.length.should.be.equal 4
          done()

      it 'remove a previous declared file', (done) ->
        @bumped.config.remove
          file: 'test.json'
          outputMessage: true
          save: true
        , (err, files) ->
          (err?).should.be.equal false
          files.length.should.be.equal 3
          config = fs.readFileSync('.bumpedrc', encoding: 'utf8')
          config = CSON.parse config
          config.files.length.should.be.equal 3
          done()

    describe 'set ::', ->
      it 'change a property across the files', ->
        descriptionValue = 'a new description for the project'
        @bumped.config.set
          property: 'description'
          value: descriptionValue
          outputMessage: true
        , (err) ->
          (err?).should.be.equal false
          require('./sample_directory/bower.json').description.should.be.equal descriptionValue
          require('./sample_directory/package.json').description.should.be.equal descriptionValue
          require('./sample_directory/component.json').description.should.be.equal descriptionValue

  describe 'plugins ::', ->

    bumpedFactory 'plugin_directory'

    it 'exists a plugins section in the basic file scaffold', (done) ->
      config = fs.readFileSync(@bumped.config.rc.config, encoding: 'utf8')
      config = CSON.parse config
      (config.plugins?.prerelease?).should.be.equal true
      (config.plugins?.prerelease?).should.be.equal true
      done()

    it 'release a new version and hook pre releases plugins in order', (done) ->
      @bumped.semver.release version: '1.0.0', (err, version) ->
        done err if err
        # (err?).should.be.equal true
        done()
