var assert = require('chai').assert;
var assetsDir = '../../../../WordPressEditor/src/main/assets';
var underscore = require(assetsDir + '/libs/underscore-min.js');

// Set up globals needed by shortcode, wpload, and wpsave
global.window = {};
global._ = underscore;
global.wp = {};

// wp-admin libraries
var shortcode = require(assetsDir + '/libs/shortcode.js');
var wpload = require(assetsDir + '/libs/wpload.js');
var wpsave = require(assetsDir + '/libs/wpsave.js');

var formatterlib = require(assetsDir + '/editor-utils-formatter.js');
var formatter = formatterlib.Formatter;

// Media strings

// Image strings
var imageSrc = 'content://com.android.providers.media.documents/document/image%3A12951';
var plainImageHtml = '<img src="' + imageSrc + '" alt="" class="wp-image-123 size-full" width="172" height="244">';
var imageWrappedInLinkHtml = '<a href="' + imageSrc + '">' + plainImageHtml + '</a>';

// Captioned image strings
var imageCaptionShortcode = '[caption width="600" align="alignnone"]' + imageSrc + 'Text[/caption]';
var imageWithCaptionHtml = '<label class="wp-temp" data-wp-temp="caption" onclick="">' +
    '<span class="wp-caption" style="width:600px; max-width:100% !important;" data-caption-width="600" ' +
    'data-caption-align="alignnone">' + imageSrc + 'Text</span></label>';
var linkedImageCaptionShortcode = '[caption width="600" align="alignnone"]' + imageWrappedInLinkHtml + 'Text[/caption]';
var linkedImageCaptionHtml = '<label class="wp-temp" data-wp-temp="caption" onclick="">' +
    '<span class="wp-caption" style="width:600px; max-width:100% !important;" data-caption-width="600" ' +
    'data-caption-align="alignnone">' + imageWrappedInLinkHtml + 'Text</span></label>';

// Video strings
var videoSrc = 'content://com.android.providers.media.documents/document/video%3A12966';
var videoShortcode = '[video src="' + videoSrc + '" poster=""][/video]';
var videoHtml = '<span class="edit-container" contenteditable="false"><span class="delete-overlay"></span>' +
    '<video webkit-playsinline src="' + videoSrc + '" poster="" preload="metadata" onclick="" controls="controls">' +
    '</video></span>';

// VideoPress video strings
var vpVideoShortcode = '[wpvideo ABCD1234]';
var vpVideoHtml = '<span class="edit-container" contenteditable="false"><span class="delete-overlay"></span>' +
    '<video data-wpvideopress="ABCD1234" webkit-playsinline src="" preload="metadata" poster="svg/wpposter.svg" ' +
    'onclick="" onerror="ZSSEditor.sendVideoPressInfoRequest(\'ABCD1234\');"></video></span>';

describe('HTML to Visual formatter should correctly convert', function () {
  it('single-line HTML', function () {
    assert.equal('<p>Some text</p>\n', formatter.htmlToVisual('Some text'));
  });

  it('multi-paragraph HTML', function () {
    assert.equal('<p>Some text</p>\n<p>More text</p>\n', formatter.htmlToVisual('Some text\n\nMore text'));
  });

  testMediaParagraphWrapping('non-linked image', plainImageHtml, plainImageHtml);
  testMediaParagraphWrapping('linked image', imageWrappedInLinkHtml, imageWrappedInLinkHtml);
  testMediaParagraphWrapping('non-linked image, with caption', imageCaptionShortcode, imageWithCaptionHtml);
  testMediaParagraphWrapping('linked image, with caption', linkedImageCaptionShortcode, linkedImageCaptionHtml);
  testMediaParagraphWrapping('non-VideoPress video', videoShortcode, videoHtml);
  testMediaParagraphWrapping('VideoPress video', vpVideoShortcode, vpVideoHtml);
});

function testMediaParagraphWrapping(mediaType, htmlModeMediaHtml, visualModeMediaHtml) {
  describe(mediaType, function () {
    it('alone in post', function () {
      var visualFormattingApplied = formatter.htmlToVisual(htmlModeMediaHtml);
      assert.equal('<p>' + visualModeMediaHtml + '</p>\n', visualFormattingApplied);

      var convertedToDivs = formatter.convertPToDiv(visualFormattingApplied).replace(/\n/g, '');
      assert.equal('<div>' + visualModeMediaHtml + '</div><div><br></div>', convertedToDivs);
    });

    it('with paragraphs above and below', function () {
      var imageBetweenParagraphs = 'Line 1\n\n' + htmlModeMediaHtml + '\n\nLine 2';

      var visualFormattingApplied = formatter.htmlToVisual(imageBetweenParagraphs);
      assert.equal('<p>Line 1</p>\n<p>' + visualModeMediaHtml + '</p>\n<p>Line 2</p>\n', visualFormattingApplied);

      var convertedToDivs = formatter.convertPToDiv(visualFormattingApplied).replace(/\n/g, '');
      assert.equal('<div>Line 1</div><div>' + visualModeMediaHtml + '</div><div>Line 2</div>', convertedToDivs);
    });

    it('with line breaks above and below', function () {
      var imageBetweenLineBreaks = 'Line 1\n' + htmlModeMediaHtml + '\nLine 2';

      var visualFormattingApplied = formatter.htmlToVisual(imageBetweenLineBreaks);
      assert.equal('<p>Line 1<br />\n' + visualModeMediaHtml + '<br />\nLine 2</p>\n', visualFormattingApplied);

      var convertedToDivs = formatter.convertPToDiv(visualFormattingApplied).replace(/\n/g, '');
      assert.equal('<div>Line 1</div><div>' + visualModeMediaHtml + '</div><div>Line 2</div>', convertedToDivs);
    });

    it('start of post, with paragraph underneath', function () {
      var imageFollowedByParagraph = htmlModeMediaHtml + '\n\nLine 2';

      var visualFormattingApplied = formatter.htmlToVisual(imageFollowedByParagraph);
      assert.equal('<p>' + visualModeMediaHtml + '</p>\n<p>Line 2</p>\n', visualFormattingApplied);

      var convertedToDivs = formatter.convertPToDiv(visualFormattingApplied).replace(/\n/g, '');
      assert.equal('<div>' + visualModeMediaHtml + '</div><div>Line 2</div>', convertedToDivs);
    });

    it('start of post, with line break underneath', function () {
      var imageFollowedByLineBreak = htmlModeMediaHtml + '\nLine 2';

      var visualFormattingApplied = formatter.htmlToVisual(imageFollowedByLineBreak);
      assert.equal('<p>' + visualModeMediaHtml + '<br \/>\nLine 2</p>\n', visualFormattingApplied);

      var convertedToDivs = formatter.convertPToDiv(visualFormattingApplied).replace(/\n/g, '');
      assert.equal('<div>' + visualModeMediaHtml + '</div><div>Line 2</div>', convertedToDivs);
    });

    it('end of post, with paragraph above', function () {
      var imageUnderParagraph = 'Line 1\n\n' + htmlModeMediaHtml;

      var visualFormattingApplied = formatter.htmlToVisual(imageUnderParagraph);
      assert.equal('<p>Line 1</p>\n<p>' + visualModeMediaHtml + '</p>\n', visualFormattingApplied);

      var convertedToDivs = formatter.convertPToDiv(visualFormattingApplied).replace(/\n/g, '');
      assert.equal('<div>Line 1</div><div>' + visualModeMediaHtml + '</div><div><br></div>', convertedToDivs);
    });

    it('end of post, with line break above', function () {
      var imageUnderLineBreak = 'Line 1\n' + htmlModeMediaHtml;

      var visualFormattingApplied = formatter.htmlToVisual(imageUnderLineBreak);
      assert.equal('<p>Line 1<br \/>\n' + visualModeMediaHtml + '</p>\n', visualFormattingApplied);

      var convertedToDivs = formatter.convertPToDiv(visualFormattingApplied).replace(/\n/g, '');
      assert.equal('<div>Line 1</div><div>' + visualModeMediaHtml + '</div><div><br></div>', convertedToDivs);
    });
  });
}
