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

/**
 * @fileOverview
 * Polyfill `setTimeout` on Android V8 using native method
 * `setTimeoutNative(callbackId, time)` and JS method
 * `setTimeoutCallback(callbackId)`.
 * This polyfill is only used in virtual-DOM diff & flush agorithm. Not
 * accessed by JS Bundle code (The timer APIs polyfill for JS Bundle is in
 * `html5/default/app/ctrl.js`).
 */

const originalSetTimeout = global.setTimeout
const setTimeoutNative = global.setTimeoutNative

/**
 * Set up native timer
 */
/* istanbul ignore next */
export function setNativeTimer () {
  if (typeof setTimeout === 'undefined' &&
  typeof setTimeoutNative === 'function') {
    const timeoutMap = {}
    let timeoutId = 0

    global.setTimeout = (cb, time) => {
      timeoutMap[++timeoutId] = cb
      setTimeoutNative(timeoutId.toString(), time)
    }

    global.setTimeoutCallback = (id) => {
      if (typeof timeoutMap[id] === 'function') {
        timeoutMap[id]()
        delete timeoutMap[id]
      }
    }
  }
}

/* istanbul ignore next */
export function resetNativeTimer () {
  global.setTimeout = originalSetTimeout
  global.setTimeoutCallback = null
}

setNativeTimer()
