var tape = require("tape"),
    path = require("path"),
    validateSettings = require("../lib/settings/validate-settings.js"),
    validateThemes = require("../lib/settings/validate-themes.js"),
    load = require("../lib/settings/load.js");

tape("Load test", function(test) {

  test.throws(function(){
    load("settings/blah.js");
  }, /No .+ file found/);

  test.throws(function(){
    load("README.md");
  }, /SyntaxError/);

  test.doesNotThrow(function(){
    load("settings/themes.json");
  });

  test.doesNotThrow(function(){
    load("settings/index.js");
  });

  test.end();

});

tape("Required fields", function(test) {

  test.throws(function(){
    validateSettings({});
  }, /settings.workingDirectory is required/);

  test.throws(function(){
    validateSettings({ workingDirectory: 1 });
  }, /settings.workingDirectory is required/);

  test.throws(function(){
    validateSettings({ workingDirectory: "" });
  }, /settings.storagePath/);

  test.throws(function(){
    validateSettings({ workingDirectory: "", storagePath: 1 });
  }, /settings.storagePath/);

  test.doesNotThrow(function(){
    validateSettings({ workingDirectory: path.join(__dirname), storagePath: path.join(__dirname) });
  }, /settings.storagePath/);

  test.doesNotThrow(function(){
    validateSettings({ workingDirectory: path.join(__dirname), s3Bucket: "bucket" });
  }, /settings.storagePath/);

  test.end();

});

tape("Max upload size", function(test) {

  test.throws(function(){
    validateSettings({ workingDirectory: path.join(__dirname), storagePath: path.join(__dirname), maxUploadSize: "a lot" });
  }, /settings.maxUploadSize/);

  test.end();

});

tape("Normalizing paths", function(test) {

  var relative = validateSettings({
    storagePath: "test/",
    workingDirectory: "test/"
  });

  var absolute = validateSettings({
    storagePath: path.join(__dirname),
    workingDirectory: path.join(__dirname)
  });

  var relative2 = validateSettings({
    storagePath: "test",
    workingDirectory: "test"
  });

  test.equal(path.relative(relative.storagePath, absolute.storagePath), "");
  test.equal(path.relative(relative.workingDirectory, absolute.workingDirectory), "");
  test.equal(path.relative(relative2.storagePath, absolute.storagePath), "");
  test.equal(path.relative(relative2.workingDirectory, absolute.workingDirectory), "");

  test.end();

});

tape("Normalize S3 bucket", function(test) {

  var settings = validateSettings({
    s3Bucket: "bucket",
    workingDirectory: "test/"
  });

  test.equal(settings.s3Bucket, "bucket");
  test.equal(settings.storagePath, "");

  var settings = validateSettings({
    s3Bucket: "s3://bucket",
    workingDirectory: "test/"
  });

  test.equal(settings.s3Bucket, "bucket");
  test.equal(settings.storagePath, "");

  settings = validateSettings({
    s3Bucket: "s3://bucket/",
    workingDirectory: "test/"
  });

  test.equal(settings.s3Bucket, "bucket");
  test.equal(settings.storagePath, "");

  settings = validateSettings({
    s3Bucket: "s3://bucket/",
    storagePath: "/",
    workingDirectory: "test/"
  });

  test.equal(settings.s3Bucket, "bucket");
  test.equal(settings.storagePath, "");

  settings = validateSettings({
    s3Bucket: "s3://bucket/",
    storagePath: "dir",
    workingDirectory: "test/"
  });

  test.equal(settings.s3Bucket, "bucket");
  test.equal(settings.storagePath, "dir/");

  settings = validateSettings({
    s3Bucket: "s3://bucket/",
    storagePath: "dir/",
    workingDirectory: "test/"
  });

  test.equal(settings.s3Bucket, "bucket");
  test.equal(settings.storagePath, "dir/");

  settings = validateSettings({
    s3Bucket: "s3://bucket/",
    storagePath: "/dir/",
    workingDirectory: "test/"
  });

  test.equal(settings.s3Bucket, "bucket");
  test.equal(settings.storagePath, "dir/");

  test.end();

});

tape("Fonts", function(test) {

  test.throws(function(){
    validateSettings({
      s3Bucket: "bucket",
      workingDirectory: "test/",
      fonts: 1
    });
  }, /settings.fonts/);

  test.throws(function(){
    validateSettings({
      s3Bucket: "bucket",
      workingDirectory: "test/",
      fonts: {}
    });
  }, /settings.fonts/);

  doesWarn(test, function(){
    validateSettings({
      s3Bucket: "bucket",
      workingDirectory: "test/",
      fonts: [
        {}
      ]
    });
  }, /settings.fonts.+missing/);

  doesWarn(test, function(){
    validateSettings({
      s3Bucket: "bucket",
      workingDirectory: "test/",
      fonts: [
        { family: "" }
      ]
    });
  }, /settings.fonts.+missing/);

  doesWarn(test, function(){
    validateSettings({
      s3Bucket: "bucket",
      workingDirectory: "test/",
      fonts: [
        { file: "" }
      ]
    });
  }, /settings.fonts.+missing/);

  doesWarn(test, function(){
    validateSettings({
      s3Bucket: "bucket",
      workingDirectory: "test/",
      fonts: [
        { file: "notarealfont.ttf", family: "fake" }
      ]
    });
  }, /Font file.+does not exist/);

  doesNotWarn(test, function(){
    validateSettings({
      s3Bucket: "bucket",
      workingDirectory: "test/",
      fonts: [
        { file: "settings/fonts/SourceSansPro-Light.ttf", family: "Source Sans Pro" },
        { file: path.join(__dirname, "..", "settings/fonts/SourceSansPro-Bold.ttf"), family: "Source Sans Pro", weight: "bold" }
      ]
    });
  });

  test.end();

});

tape("Themes", function(test) {

  doesWarn(test, function(){
    validateThemes({});
  }, /No themes/);

  doesWarn(test, function(){
    validateThemes([]);
  }, /No themes/);

  doesWarn(test, function(){
    validateThemes({ "default": {} });
  }, /No themes/);

  doesNotWarn(test, function(){
    validateThemes({ "default": { width: 0, height: 0, framesPerSecond: 0, samplesPerFrame: 0 }, "theme": {} });
  });

  doesNotWarn(test, function(){
    validateThemes({ "default": { framesPerSecond: 0, samplesPerFrame: 0 }, "theme": { width: 0, height: 0 } });
  });

  doesWarn(test, function(){
    validateThemes({ "default": { height: 0, framesPerSecond: 0, samplesPerFrame: 0 }, "theme": {} });
  }, /required property 'width'/);

  doesWarn(test, function(){
    validateThemes({ "default": { width: 0, framesPerSecond: 0, samplesPerFrame: 0 }, "theme": {} });
  }, /required property 'height'/);

  doesWarn(test, function(){
    validateThemes({ "default": { width: 0, height: 0, samplesPerFrame: 0 }, "theme": {} });
  }, /required property 'framesPerSecond'/);

  doesWarn(test, function(){
    validateThemes({ "default": { width: 0, height: 0, framesPerSecond: 0 }, "theme": {} });
  }, /required property 'samplesPerFrame'/);

  doesWarn(test, function(){
    validateThemes({ "default": { width: 0, height: 0, framesPerSecond: 0, samplesPerFrame: 0 }, "theme": { backgroundImage: "doesnotexist.jpg" } });
  }, /Background image.+does not exist/);

  doesNotWarn(test, function(){
    validateThemes({ "default": { width: 0, height: 0, framesPerSecond: 0, samplesPerFrame: 0 }, "theme": { backgroundImage: "subway.jpg" } });
  });

  doesNotWarn(test, function(){
    validateThemes({ "default": { width: 0, height: 0, framesPerSecond: 0, samplesPerFrame: 0 }, "theme": { backgroundImage: path.join(__dirname, "..", "settings/backgrounds/subway.jpg") } });
  });

  test.end();

});

function doesNotWarn(test, fn) {
  doesWarn(test, fn, "");
}

function doesWarn(test, fn, regexp) {

  var output = capture();

  fn();

  if (arguments.length > 2) {
    if (typeof regexp === "string") {
      test.equal(output(), regexp);
    } else {
      test.assert(regexp.test(output()));
    }
  } else {
    test.assert(output().length);
  }

}

function capture(){

  var write = process.stderr.write,
      out = "";

  process.stderr.write = function(str) {
    out += str;
  };

  return function(){
    process.stderr.write = write;
    return out;
  }

}