
/*
 * Copyright 2017-present Open Networking Foundation

 * Licensed 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.
 */


(function () {
  'use strict';
  angular.module('xos.UITutorial')
  .service('TemplateHandler', function(_){
    
    this.error = _.template(`<span class="error">[ERROR] <%= msg %></span>`);

    this.instructions = _.template(`
      <div>
        <strong><%= title %></strong>
        <% _.forEach(messages, function(m) { %><p><%= m %></p><% }); %>
      </div>
    `);

    this.resourcesResponse = _.template(`
      <div>
        <p>Corresponding js code: <code><%= jsCode %></code></p>
        <div class="json"><%= res %></div>
      </div>
    `);

    this.jsonObject = _.template(`<div class="jsonObject"><%= JSON.stringify(obj) %><%=comma%></code></div>`);

    this.jsonCollection = _.template(`<div class="jsonCollection">[<% _.forEach(collection, function(item) { %><%= item %><%}); %>]</div>`);
  });
})();