/**
 * apeman react package for icon components.
 * @class ApIcon
 */

'use strict'

import React, {PropTypes as types} from 'react'
import {ApPureMixin} from 'apeman-react-mixins'
import classnames from 'classnames'

let assertCache = {}

/** @lends ApIcon */
const ApIcon = React.createClass({

  // --------------------
  // Specs
  // --------------------

  propTypes: {},

  mixins: [
    ApPureMixin
  ],

  statics: {
    /**
     * Check if has style.
     * @param className
     */
    hasStyleWithClass (className) {
      let styleSheets = document.styleSheets || []
      for (let i = 0; i < styleSheets.length; i++) {
        let styleSheet = styleSheets[ i ]
        let rules = styleSheet.rules || styleSheet.cssRules || []
        for (let j = 0; j < rules.length; j++) {
          let rule = rules[ j ]
          let selectorText = rule.selectorText
          let hit = selectorText && new RegExp(`\.${className}`).test(selectorText)
          if (hit) {
            return true
          }
        }
      }
      return false
    }
  },

  getInitialState () {
    return {}
  },

  getDefaultProps () {
    return {}
  },

  render () {
    const s = this
    let { props } = s

    return (
      <i className={ classnames('ap-icon', props.className) }
         style={Object.assign({}, props.style)}>
      </i>
    )
  },

  // --------------------
  // Lifecycle
  // --------------------

  componentDidMount () {
    const s = this
    let { props } = s
    s.assertClassName(props.className)
  },

  componentWillReceiveProps (nextProps) {
    const s = this
    if (nextProps.hasOwnProperty('className')) {
      s.assertClassName(nextProps.className)
    }
  },

  componentWillUnmount () {
    const s = this
    clearTimeout(s._assertTimer)
  },

  // ------------------
  // Helper
  // ------------------

  assertClassName (className) {
    if (!className) {
      return
    }
    const s = this
    clearTimeout(s._assertTimer)
    s._assertTimer = setTimeout(() => {
      let isMounted = s.isMounted()
      if (!isMounted) {
        return
      }
      className.split(/\s/g).forEach((className) => {
        if (!className) {
          return
        }
        if (assertCache.hasOwnProperty(className)) {
          return
        }
        if (/^ap/.test(className)) {
          return
        }
        let valid = ApIcon.hasStyleWithClass(className)
        if (!valid) {
          console.warn(`[ApIcon] No style found for class "${className}". You may misspell the name or miss some stylesheets.`)
        }
        assertCache[ className ] = valid
      })
    }, 100)
  },

  // ------------------
  // Private
  // ------------------

  _assertTimer: -1
})

export default ApIcon
