module.exports = function( grunt ) {
  'use strict';
  //
  // Konfiguracja Grunt:
  //
  // https://github.com/cowboy/grunt/blob/master/docs/getting_started.md
  //
  grunt.initConfig({

    // Konfiguracja projektu
    // ---------------------

    // Alternatywne położenie dla Bower.
    bower: {
      dir: 'app/components'
    },

    // Kompilacja Coffee do JS.
    coffee: {
      compile: {
        files: {
          'app/scripts/*.js': 'app/scripts/**/*.coffee',
          'test/spec/*.js': 'test/spec/**/*.coffee'
        }
      }
    },

    // Kompilacja .scss/.sass do .css za pomocą Compass.
    compass: {
      dist: {
        // http://compass-style.org/help/tutorials/configuration-reference/#configuration-properties
        options: {
          css_dir: 'temp/styles',
          sass_dir: 'app/styles',
          images_dir: 'app/images',
          javascripts_dir: 'temp/scripts',
          force: true
        }
      }
    },

    // Wygenerowanie pliku manifestu aplikacji.
    manifest:{
      dest: ''
    },

    // Konfiguracja domyślna monitorowania.
    watch: {
      coffee: {
        files: 'app/scripts/**/*.coffee',
        tasks: 'coffee reload'
      },
      compass: {
        files: [
          'app/styles/**/*.{scss,sass}'
        ],
        tasks: 'compass reload'
      },
      reload: {
        files: [
          'app/*.html',
          'app/styles/**/*.css',
          'app/scripts/**/*.js',
          'app/views/**/*.html',
          'app/images/**/*'
        ],
        tasks: 'reload'
      }
    },

    // Konfiguracja domyślna lint, dopasuj ją do własnych potrzeb:
    // https://github.com/cowboy/grunt/blob/master/docs/task_lint.md#lint-built-in-task
    lint: {
      files: [
        'Gruntfile.js',
        'app/scripts/**/*.js',
        'spec/**/*.js'
      ]
    },

    // Opcje i ustawienia globalne JSHint.
    // https://github.com/cowboy/grunt/blob/master/docs/task_lint.md#specifying-jshint-options-and-globals
    jshint: {
      options: {
        curly: true,
        eqeqeq: true,
        immed: true,
        latedef: true,
        newcap: true,
        noarg: true,
        sub: true,
        undef: true,
        boss: true,
        eqnull: true,
        browser: true
      },
      globals: {
        angular: true
      }
    },

    // Konfiguracja kompilacji
    // -----------------------

    // Katalog tymczasowy używany w trakcie procesu.
    staging: 'temp',
    // Ostateczne dane wyjściowe.
    output: 'dist',

    mkdirs: {
      staging: 'app/'
    },

    // Poniżej wszystkie ścieżki dostępu są podane względem katalogu tymczasowego,
    // który jest kopią katalogu app/. Wszelkie pliki .gitignore, .ignore i .buildignore
    // znajdujące się w drzewie katalogu app/ będą użyte do zignorowania wskazanych
    // elementów w trakcie procesu kopiowania.

    // Połączenie plików css/**/*.css, osadzone polecenine @import, dane wyjściowe mają postać pojedynczego, zminimalizowanego pliku CSS.
    css: {
      'styles/main.css': ['styles/**/*.css']
    },

    // Zmiana nazwy JS/CSS polegająca na poprzedzeniu wartością hash,
    // aby ułatwić wersjonowanie.
    rev: {
      js: 'scripts/**/*.js',
      css: 'styles/**/*.css',
      img: 'images/**'
    },

    // usemin-handler powinien wskazywać plik zawierający
    // bloki usemin do przetworzenia/
    'usemin-handler': {
      html: 'index.html'
    },

    // Uaktualnienie odniesień w HTML/CSS.
    usemin: {
      html: ['**/*.html'],
      css: ['**/*.css']
    },

    // Minimalizacja HTML.
    html: {
      files: ['**/*.html']
    },

    // Optymalizacja plików JPG i PNG (za pomocą jpegtran & optipng).
    img: {
      dist: '<config:rev.img>'
    },

    // Konfiguracja rjs. Niekoniecznie trzeba podawać typową konfigurację
    // 'path', ponieważ rjs przetworzy wartości z modułu głównego używając
    // http://requirejs.org/docs/optimization.html#mainConfigFile
    //
    // Należy używać pliku name / out / mainConfig. Można pozostawić pustą wartość,
    // jeżeli używasz usemin-handler do przetworzenia konfiguracji rjs z kodu znaczników
    // konfiguracja domyślna).
    rjs: {
      // Nie jest przeprowadzana minimalizacja przez zadanie min.
      optimize: 'none',
      baseUrl: './scripts',
      wrap: true
    }
  });

  // Alias zadania 'test' powodujący uruchomienie zadania 'testacular'.
  grunt.registerTask('test', 'uruchomienie testacular', function () {
    var done = this.async();
    require('child_process').exec('testacular start --single-run', function (err, stdout) {
      grunt.log.write(stdout);
      done(err);
    });
  });
};
