/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

var App = require('app');
require('mappers/configs/themes_mapper');
require('models/configs/theme/tab');
require('models/configs/theme/section');
require('models/configs/theme/sub_section');

describe('App.themeMapper', function () {

  describe('#map', function() {
    var json = {
      items: [
        {}
      ]
    };
    beforeEach(function() {
      sinon.stub(App.themesMapper, 'mapThemeLayouts');
      sinon.stub(App.themesMapper, 'mapThemeConfigs');
      sinon.stub(App.themesMapper, 'mapThemeWidgets');
      sinon.stub(App.themesMapper, 'generateAdvancedTabs');
      sinon.stub(App.store, 'safeLoadMany');
      App.themesMapper.map(json, ['S1']);
    });
    afterEach(function() {
      App.store.safeLoadMany.restore();
      App.themesMapper.mapThemeLayouts.restore();
      App.themesMapper.mapThemeConfigs.restore();
      App.themesMapper.mapThemeWidgets.restore();
      App.themesMapper.generateAdvancedTabs.restore();
      App.set('enableLogger', true);
    });

    it('mapThemeLayouts should be called', function() {
      expect(App.themesMapper.mapThemeLayouts.calledWith({}, [])).to.be.true;
    });
    it('mapThemeConfigs should be called', function() {
      expect(App.themesMapper.mapThemeConfigs.calledWith({})).to.be.true;
    });
    it('mapThemeWidgets should be called', function() {
      expect(App.themesMapper.mapThemeWidgets.calledWith({})).to.be.true;
    });
    it('generateAdvancedTabs should be called', function() {
      expect(App.themesMapper.generateAdvancedTabs.calledWith(['S1'])).to.be.true;
    });
    it('App.store.safeLoadMany should be called', function() {
      expect(App.store.safeLoadMany.calledOnce).to.be.true;
    });
  });

  describe('#mapThemeLayouts', function() {
    var json = {
      ThemeInfo: {
        service_name: 'S1',
        theme_data: {
          Theme: {
            name: 'theme1',
            configuration: {
              layouts: [
                {
                  tabs: [
                    {
                      name: 't1',
                      layout: {
                        sections: [
                          {
                            "name": 'SEC1',
                            "display-name": 'sec1',
                            "row-index": 1,
                            "column-index": 2,
                            "row-span": 3,
                            "column-span": 4,
                            "section-columns": 5,
                            "section-rows": 6,
                            "tab_id": 1
                          }
                        ]
                      }
                    }
                  ]
                }
              ]
            }
          }
        }
      }
    };
    beforeEach(function() {
      sinon.stub(App.themesMapper, 'loadSubSections');
      sinon.stub(App.store, 'safeLoadMany');
    });
    afterEach(function() {
      App.themesMapper.loadSubSections.restore();
      App.store.safeLoadMany.restore();
    });

    it('loadSubSections should be called', function() {
      App.themesMapper.mapThemeLayouts(json, []);
      expect(App.themesMapper.loadSubSections.getCall(0).args).to.be.eql([
        {
          "name": 'SEC1',
          "display-name": 'sec1',
          "row-index": 1,
          "column-index": 2,
          "row-span": 3,
          "column-span": 4,
          "section-columns": 5,
          "section-rows": 6,
          "tab_id": 1
        },
        {
          "column_index": 2,
          "column_span": 4,
          "display_name": "sec1",
          "id": "SEC1_S1_t1",
          "name": "SEC1",
          "row_index": 1,
          "row_span": 3,
          "section_columns": 5,
          "section_rows": 6,
          "tab_id": "S1_t1"
        }, 'S1', 'theme1'
      ])
    });

    it('App.store.safeLoadMany should be called', function() {
      App.themesMapper.mapThemeLayouts(json, []);
      expect(App.store.safeLoadMany.getCall(0).args[1]).to.be.eql([{
        "column_index": 2,
        "column_span": 4,
        "display_name": "sec1",
        "id": "SEC1_S1_t1",
        "name": "SEC1",
        "row_index": 1,
        "row_span": 3,
        "section_columns": 5,
        "section_rows": 6,
        "tab_id": "S1_t1"
      }]);
    });

    it('should add tab to tabs', function() {
      var tabs = [];
      App.themesMapper.mapThemeLayouts(json, tabs);
      expect(tabs).to.have.length(1);
    });
  });

  describe('#loadSubSections', function() {
    var section = {
      subsections: [
        {
          "name": 'SSEC1',
          "display-name": 'ssec1',
          "border": 1,
          "row-index": 2,
          "column-index": 3,
          "column-span": 4,
          "row-span": 5,
          "config_properties": [],
          "section_id": 1,
          "depends-on": [],
          "left-vertical-splitter": 6
        }
      ]
    };
    beforeEach(function() {
      sinon.stub(App.themesMapper, 'loadSubSectionTabs');
      sinon.stub(App.themesMapper, 'mapThemeConditions');
      sinon.stub(App.store, 'safeLoadMany');
    });
    afterEach(function() {
      App.store.safeLoadMany.restore();
      App.themesMapper.loadSubSectionTabs.restore();
      App.themesMapper.mapThemeConditions.restore();
    });

    it('loadSubSectionTabs should be called', function() {
      App.themesMapper.loadSubSections(section, {id: 1}, 's1', 't1');
      expect(App.themesMapper.loadSubSectionTabs.getCall(0).args).to.be.eql([
        {
          "name": 'SSEC1',
          "display-name": 'ssec1',
          "border": 1,
          "row-index": 2,
          "column-index": 3,
          "column-span": 4,
          "row-span": 5,
          "config_properties": [],
          "section_id": 1,
          "depends-on": [],
          "left-vertical-splitter": 6
        },
        {
          "border": 1,
          "column_index": 3,
          "column_span": 4,
          "configProperties": [],
          "depends_on": [],
          "display_name": "ssec1",
          "id": "SSEC1_s1_t1",
          "left_vertical_splitter": 6,
          "name": "SSEC1",
          "row_index": 2,
          "row_span": 5,
          "section_id": 1,
          "theme_name": "t1",
        }
      ]);
    });

    it('mapThemeConditions should be called', function() {
      App.themesMapper.loadSubSections(section, {id: 1}, 's1', 't1');
      expect(App.themesMapper.mapThemeConditions.getCall(0).args).to.be.eql([
        [{
          "border": 1,
          "column_index": 3,
          "column_span": 4,
          "configProperties": [],
          "depends_on": [],
          "display_name": "ssec1",
          "id": "SSEC1_s1_t1",
          "left_vertical_splitter": 6,
          "name": "SSEC1",
          "row_index": 2,
          "row_span": 5,
          "section_id": 1,
          "theme_name": "t1"
        }],
        'subsection'
      ]);
    });

    it('App.store.safeLoadMany should be called', function() {
      App.themesMapper.loadSubSections(section, {id: 1}, 's1', 't1');
      expect(App.store.safeLoadMany.getCall(0).args[1]).to.be.eql([
        {
          "border": 1,
          "column_index": 3,
          "column_span": 4,
          "configProperties": [],
          "depends_on": [],
          "display_name": "ssec1",
          "id": "SSEC1_s1_t1",
          "left_vertical_splitter": 6,
          "name": "SSEC1",
          "row_index": 2,
          "row_span": 5,
          "section_id": 1,
          "theme_name": "t1"
        }
      ]);
    });

    it('sub_sections should be set', function() {
      var parsedSection = {id: 1};
      App.themesMapper.loadSubSections(section, parsedSection);
      expect(parsedSection.sub_sections).to.have.length(1);
    });
  });

  describe('#loadSubSectionTabs', function() {
    var subSection = {
      "subsection-tabs": [
        {
          "name": 'SEC1',
          "display-name": 'sec1',
          "depends-on": [],
          "sub_section_id": 'SUB1'
        }
      ]
    };
    beforeEach(function() {
      sinon.stub(App.themesMapper, 'mapThemeConditions');
      sinon.stub(App.store, 'safeLoadMany');
    });
    afterEach(function() {
      App.themesMapper.mapThemeConditions.restore();
      App.store.safeLoadMany.restore();
    });

    it('mapThemeConditions should be called', function() {
      App.themesMapper.loadSubSectionTabs(subSection, {id: 2, theme_name: "t1"});
      expect(App.themesMapper.mapThemeConditions.getCall(0).args).to.be.eql([
        [{
          "depends_on": [],
          "display_name": "sec1",
          "id": "SEC1",
          "is_active": true,
          "name": "SEC1",
          "sub_section_id": 2,
          "theme_name": "t1"
        }],
        'subsectionTab'
      ]);
    });

    it('App.store.safeLoadMany should be called', function() {
      App.themesMapper.loadSubSectionTabs(subSection, {id: 2, theme_name: "t1"});
      expect(App.store.safeLoadMany.getCall(0).args[1]).to.be.eql([
        {
          "depends_on": [],
          "display_name": "sec1",
          "id": "SEC1",
          "is_active": true,
          "name": "SEC1",
          "sub_section_id": 2,
          "theme_name": "t1"
        }
      ]);
    });

    it('sub_section_tabs should be set', function() {
      var parsedSubSection = {id: 3};
      App.themesMapper.loadSubSectionTabs(subSection, parsedSubSection);
      expect(parsedSubSection.sub_section_tabs).to.have.length(1);
    });
  });

  describe('#mapThemeConfigs', function() {
    var json;

    beforeEach(function() {
      json = {
        ThemeInfo: {
          service_name: 'S1',
          theme_data: {
            Theme: {
              configuration: {
                placement: {
                  configs: [{
                    "subsection-name": '',
                    "subsection-tab-name": '',
                    "depends-on": [{}]
                  }]
                }
              }
            }
          }
        }
      };
      this.mockSection = sinon.stub(App.SubSection, 'find');
      this.mockSectionTab = sinon.stub(App.SubSectionTab, 'find');
      sinon.stub(App.configsCollection, 'getConfig').returns({id: 'foo'});
      sinon.stub(App.themesMapper, 'getConfigByAttributes').returns({});
      sinon.stub(App.themesMapper, 'mapThemeConfigConditions');
    });
    afterEach(function() {
      this.mockSection.restore();
      this.mockSectionTab.restore();
      App.configsCollection.getConfig.restore();
      App.themesMapper.getConfigByAttributes.restore();
      App.themesMapper.mapThemeConfigConditions.restore();
    });

    it('should call mapThemeConfigConditions', function() {
      App.themesMapper.mapThemeConfigs(json);
      expect(App.themesMapper.mapThemeConfigConditions.calledOnce).to.be.true;
    });

    it('should call getConfigByAttributes', function() {
      App.themesMapper.mapThemeConfigs(json);
      expect(App.themesMapper.getConfigByAttributes.calledOnce).to.be.true;
    });

    it('should set config to subSection', function() {
      json.ThemeInfo.theme_data.Theme.configuration.placement.configs[0]["subsection-name"] = 'ss-1';
      var subSection = Em.Object.create({
        configProperties: []
      });
      this.mockSection.returns(subSection);
      App.themesMapper.mapThemeConfigs(json);
      expect(subSection.get('configProperties')).to.be.eql(['foo']);
    });

    it('should set config to SubSectionTab', function() {
      json.ThemeInfo.theme_data.Theme.configuration.placement.configs[0]["subsection-tab-name"] = 'sst-1';
      var subSectionTab = Em.Object.create({
        configProperties: []
      });
      this.mockSectionTab.returns(subSectionTab);
      App.themesMapper.mapThemeConfigs(json);
      expect(subSectionTab.get('configProperties')).to.be.eql(['foo']);
    });
  });

  describe('#mapThemeConfigConditions', function () {
    beforeEach(function () {
      sinon.stub(App.store, 'safeLoadMany');
    });
    afterEach(function () {
      App.store.safeLoadMany.restore();
    });

    it('App.store.safeLoadMany should be called', function () {
      var configConditions = [
        {
          configs: ['foo/bar']
        }
      ];
      var configProperty = {
        id: 'c1',
        name: 'config1',
        filename: 'file1.xml'
      };
      App.themesMapper.mapThemeConfigConditions(configConditions, configProperty);
      expect(App.store.safeLoadMany.getCall(0).args[1][0]).to.be.eql({
        "config_name": "config1",
        "configs": [
          {
            "configName": "bar",
            "fileName": "foo.xml"
          }
        ],
        "file_name": "file1.xml",
        "id": "c1_0",
        "resource": "config",
        "type": "config"
      });
    });
  });

  describe('#mapThemeConditions', function () {
    beforeEach(function () {
      sinon.stub(App.store, 'safeLoadMany');
    });
    afterEach(function () {
      App.store.safeLoadMany.restore();
    });

    it('App.store.safeLoadMany should be called', function () {
      var subSections = [
        {
          id: 'ss-1',
          name: 'sub-section',
          "depends_on": [
            {
              configs: ['foo/bar']
            }
          ]
        }
      ];

      App.themesMapper.mapThemeConditions(subSections, 'type1');
      expect(App.store.safeLoadMany.getCall(0).args[1][0]).to.be.eql({
        "id": "ss-1_0",
        "name": 'sub-section',
        "configs": [
          {
            "configName": "bar",
            "fileName": "foo.xml"
          }
        ],
        "resource": "config",
        "type": "type1"
      });
    });
  });

  describe('#mapThemeWidgets', function() {
    var json = {
      ThemeInfo: {
        theme_data: {
          Theme: {
            configuration: {
              widgets: [
                {
                  widget: {
                    type: 'foo'
                  },
                  config: 'foo/bar'
                }
              ]
            }
          }
        }
      }
    };
    beforeEach(function() {
      this.mockConfig = sinon.stub(App.configsCollection, 'getConfig');
      this.mockConfigByName = sinon.stub(App.configsCollection, 'getConfigByName');
    });
    afterEach(function() {
      this.mockConfig.restore();
      this.mockConfigByName.restore();
    });

    it('should set widget to configProperty', function() {
      var configProperty = Em.Object.create();
      this.mockConfig.returns(configProperty);
      App.themesMapper.mapThemeWidgets(json);
      expect(configProperty.get('widget')).to.be.eql({type: 'foo'});
      expect(configProperty.get('widgetType')).to.be.equal('foo');
    });
    it('should set widget to uiOnlyProperty', function() {
      var uiOnlyProperty = Em.Object.create();
      this.mockConfigByName.returns(uiOnlyProperty);
      App.themesMapper.mapThemeWidgets(json);
      expect(App.configsCollection.getConfigByName.calledWith('bar', 'foo.xml')).to.be.true;
      expect(uiOnlyProperty.get('widget')).to.be.eql({type: 'foo'});
      expect(uiOnlyProperty.get('widgetType')).to.be.equal('foo');
    });
  });

  describe('#getConfigId', function() {
    it('should return config id', function() {
      expect(App.themesMapper.getConfigId({config: 'foo/bar'})).to.be.equal('bar__foo');
    });
    it('should return null', function() {
      expect(App.themesMapper.getConfigId(null)).to.be.null;
    });
  });

  describe('#generateAdvancedTabs', function() {
    beforeEach(function() {
      sinon.stub(App.StackService, 'find').returns([]);
      sinon.stub(App.store, 'safeLoadMany');
    });
    afterEach(function() {
      App.StackService.find.restore();
      App.store.safeLoadMany.restore();
    });

    it('App.store.safeLoadMany should be called', function() {
      App.themesMapper.generateAdvancedTabs(['S1']);
      expect(App.store.safeLoadMany.getCall(0).args[1][0]).to.be.eql({
        id: 'S1_advanced',
        name: 'advanced',
        display_name: 'Advanced',
        is_advanced: true,
        service_name: 'S1'
      });
    });
  });

  describe('#getConfigByAttributes', function() {
    var configLink = {
      "config": 'foo/bar',
      "property_value_attributes": {
        "ui_only_property": {}
      }
    };
    beforeEach(function() {
      sinon.stub(App.configsCollection, 'getConfig').returns(null);
      sinon.stub(App.configsCollection, 'add');
    });
    afterEach(function() {
      App.configsCollection.getConfig.restore();
      App.configsCollection.add.restore();
    });

    it('App.configsCollection.add should be called', function() {
      var subSection = Em.Object.create({configProperties: []});
      var subSectionTab = Em.Object.create({configProperties: []});
      App.themesMapper.getConfigByAttributes({}, configLink, subSection, subSectionTab, 'S1');
      expect(App.configsCollection.add.getCall(0).args[0]).to.be.eql({
        id: 'bar__foo',
        isRequiredByAgent: false,
        showLabel: false,
        isOverridable: false,
        recommendedValue: true,
        name: 'bar',
        isUserProperty: false,
        filename: 'foo.xml',
        fileName: 'foo.xml',
        isNotSaved: false,
        serviceName: 'S1',
        copy: '',
        stackName: 'HDP',
        stackVersion: '2.3'
      });
    });

    it('should return configProperty', function() {
      var subSection = Em.Object.create({configProperties: []});
      var subSectionTab = Em.Object.create({configProperties: []});
      expect(App.themesMapper.getConfigByAttributes({}, configLink, subSection, subSectionTab, 'S1')).to.be.eql({
        id: 'bar__foo',
        isRequiredByAgent: false,
        showLabel: false,
        isOverridable: false,
        recommendedValue: true,
        name: 'bar',
        isUserProperty: false,
        filename: 'foo.xml',
        fileName: 'foo.xml',
        isNotSaved: false,
        serviceName: 'S1',
        copy: '',
        stackName: 'HDP',
        stackVersion: '2.3'
      });
    });

    it('should add config to SubSection properties', function() {
      var subSection = Em.Object.create({configProperties: []});
      var subSectionTab = Em.Object.create({configProperties: []});
      App.themesMapper.getConfigByAttributes({}, configLink, subSection, subSectionTab, 'S1');
      expect(subSection.get('configProperties')).to.be.eql(['bar__foo']);
    });
  });
});
