var angular = require('angular');
require('jsUtil');
require('../modules');
require('./AppConfig');

var module = angular.module('commons.services.common');

module.factory('CommonService', function($state,
  $ionicPopup, $ionicLoading, $ionicModal, AppConfig, $rootScope) {
  var htmlEscapes = {
      '&': '&amp;',
      '<': '&lt;',
      '>': '&gt;',
      '"': '&quot;',
      '\'': '&#x27;',
      '/': '&#x2F;'
    },
    __hasProp = {}.hasOwnProperty;

  var htmlEscaper = /[&<>"'\/]/g;

  var service = {
    /**
     * 转译字符串中的html代码。
     * @param  {String} string 需要转译的字串
     * @return {String}        转译后的字符串
     */
    escapeHtml: function(string) {
      return ('' + string).replace(htmlEscaper, function(match) {
        return htmlEscapes[match];
      });
    },
    /**
     * 获取当前状态的父状态。
     */
    getParentState: function() {
      return $state.current.parent ? $state.current.parent : service.getCookie($state.current.name + '.parent');
    },
    /**
     * 获取cookie值
     * @param  {String} key 键
     */
    getCookie: function(key) {
      //TODO 删除代码，不要再使用Cookie
      //throw new Error('不要使用cookie，请使用localstorage等替代。');
    },
    /**
     * 设置cookie.
     * @param {String} key   键
     * @param {Object} value 值
     */
    setCookie: function(key, value) {
      //TODO 删除代码，不要再使用Cookie
      //throw new Error('不要使用cookie，请使用localstorage等替代。');
    },

    /**
     * 弹出提示信息。
     * @param  {String} msg
     */
    showAlert: function(msg, title) {
      return $ionicPopup.alert({
        title: title || '提示',
        template: msg,
        okText: '确定'
      });
    },
    /**
     * 显示弹框
     * @param  {String} templateUrl 弹框的模板
     * @return {[type]}             [description]
     */
    createModal: function(templateUrl, scope, hardwareBackButtonClose) {
      return $ionicModal.fromTemplateUrl(templateUrl, {
        scope: scope,
        animation: 'slide-in-up',
        hardwareBackButtonClose: hardwareBackButtonClose === false ? false : true
      });
    },
    /**
     * 显示加载中画面。
     */
    showLoading: function() {
      return $ionicLoading.show({
        content: '加载中..',
        animation: 'fade-in',
        showBackdrop: false
      });
    },

    /**
     * 将元素添加到数组中。
     * @param {Array} array 目标数组。
     * @param {Object|Array} items 需要添加到目标数组的元素。
     */
    addItems: function(array, items) {
      if (jsUtil.isArray(items)) {
        Array.prototype.push.apply(array, items);
      } else {
        array.push(items);
      }
    },
    /**
     * 解析日期字符串。
     * @param  {String} str 如2014-04-23T17:07:39.488Z
     * @return {String}  返回    如 2014年04月23日 17:07
     */
    parseDateStr: function(str) {
      return jsUtil.transferDateStr(str, 'Y-m-dTH:i:s.uZ', 'Y-m-d H:i');
    },
    /**
     * 智能日期解析（列表中显示）。
     * <p>
     * <ul>
     *  <li>如果是当天，则显示如：11:39</li>
     *  <li>否则，如果是昨天，则显示：昨天</li>
     *  <li>否则，如果是小于一周的时间，则显示周几，如：星期六</li>
     *  <li>否则，如果超过一周，则显示日期，如：4月28日</li>
     *  <li>否则，如果超过一年，则显示年份+日期，如：2013年5月5日</li>
     * </ul>
     * </p>
     * @param  {String} str 待解析的日期字符串
     * @return {String}
     */
    smartListDateParser: function(str) {
      return jsUtil.smartListDateParser(str);
    },
    /**
     * 智能日期解析（详情中显示）。
     * <p>
     * <ul>
     *  <li>如果是当天，则显示如：11:39</li>
     *  <li>否则，如果是昨天，则显示：昨天 12:20</li>
     *  <li>否则，如果是小于一周的时间，则显示周几，如：星期六 12:30</li>
     *  <li>否则，如果超过一周，则显示日期，如：4月28日 13:08</li>
     *  <li>否则，如果超过一年，则显示年份+日期，如：2013年5月5日 5:48</li>
     * </ul>
     * </p>
     * @param  {String} str 待解析的日期字符串
     * @return {String}
     */
    smartInfoDateParser: function(str) {
      return jsUtil.smartInfoDateParser(str);
    },

    extend: function(child, parent) {
      for (var key in parent) {
        if (__hasProp.call(parent, key)) {
          child[key] = parent[key];
        }
      }

      function ctor() {
        this.constructor = child;
      }
      ctor.prototype = parent.prototype;
      child.prototype = new ctor();
      child.__super__ = parent.prototype;
      child.__super__.constructor = parent;
      return child;
    }
  };

  return service;
});
