/*
 * 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.
 */
package com.taobao.weex.common;

import android.support.annotation.RestrictTo;

import com.taobao.weex.WXEnvironment;
import com.taobao.weex.utils.WXViewUtils;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public class WXPerformance {

  @RestrictTo(RestrictTo.Scope.LIBRARY)
  public enum Dimension {
    JSLibVersion,
    WXSDKVersion,
    pageName,
    spm,
    scheme,
    cacheType,
    requestType,
    networkType,
    connectionType,
    zcacheInfo,
    wxdim1,
    wxdim2,
    wxdim3,
    wxdim4,
    wxdim5,
    bizType,
    templateUrl,
    useScroller
  }

  public enum Measure {
    /**
     * range : [min,max)
     */
    JSLibSize(0D, Double.MAX_VALUE),
    //normal 300ms.. first install apk 30s ?
    JSLibInitTime(0D, 80000D),
    SDKInitTime(0D, 120000D),
    SDKInitInvokeTime(0D, 5000D),
    SDKInitExecuteTime(0D, 5000D),
    JSTemplateSize(0D, 5000D),
    pureNetworkTime(0D, 15000D),
    networkTime(0D, 15000D),
    fsCreateInstanceTime(0D, 3000D),
    fsCallJsTotalTime(0D, 5000D),
    fsCallJsTotalNum(0D, Double.MAX_VALUE),
    fsCallNativeTotalTime(0D, 5000D),
    fsCallNativeTotalNum(0D, Double.MAX_VALUE),
    fsCallEventTotalNum(0D, Double.MAX_VALUE),
    fsComponentCount(0D,100000D),
    fsComponentCreateTime(0D,Double.MAX_VALUE),
    fsRenderTime(0D, 5000D),
    fsRequestNum(0D, 100D),
    callCreateFinishTime(0D, 10000D),
    cellExceedNum(0D, Double.MAX_VALUE),
    communicateTotalTime(0D, 5000D),
    maxDeepViewLayer(0D, Double.MAX_VALUE),
    maxDeepVDomLayer(0D, Double.MAX_VALUE),
    componentCount(0D, 1000000),
    componentCreateTime(0D,Double.MAX_VALUE),
    avgFps(0D, 61D),
    timerCount(0D, Double.MAX_VALUE),

    MaxImproveMemory(0D, Double.MAX_VALUE),
    BackImproveMemory(0D, Double.MAX_VALUE),
    PushImproveMemory(0D, Double.MAX_VALUE),
    measureTime1(0D, Double.MAX_VALUE),
    measureTime2(0D, Double.MAX_VALUE),
    measureTime3(0D, Double.MAX_VALUE),
    measureTime4(0D, Double.MAX_VALUE),
    measureTime5(0D, Double.MAX_VALUE),

    callBridgeTime(0D, Double.MAX_VALUE),
    cssLayoutTime(0D, Double.MAX_VALUE),
    parseJsonTime(0D, Double.MAX_VALUE),

    communicateTime(0D, 5000D),
    screenRenderTime(0D, 5000D),
    totalTime(0D, 5000D),
    localReadTime(0D, 5000D),
    templateLoadTime(0D, 5000D),
    packageSpendTime(0D, 5000D),
    syncTaskTime(0D, 5000D),
    actualNetworkTime(0D, 5000D),
    firstScreenJSFExecuteTime(0D, 5000D),
    //..

    fluency(0D, 101D),
    imgSizeCount(0D, 2000D),
    interactionTime(0D,10000D);


    private double mMinRange, mMaxRange;

    Measure(double min, double max) {
      this.mMinRange = min;
      this.mMaxRange = max;
    }

    public double getMinRange() {
      return mMinRange;
    }

    public double getMaxRange() {
      return mMaxRange;
    }
  }

  public static final String DEFAULT = "default";

  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
  public static final String CACHE_TYPE = "cacheType";

  public static final int VIEW_LIMIT_HEIGHT = WXViewUtils.getScreenHeight() / 2;
  public static final int VIEW_LIMIT_WIDTH = WXViewUtils.getScreenWidth() / 2;
  public static boolean TRACE_DATA = WXEnvironment.isApkDebugable();

  /**
   * No longer needed.
   */
  @Deprecated
  public String bizType = "weex";

  /**
   * Use {@link #pageName} instead.
   */
  @Deprecated
  public String templateUrl;

  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
  public String cacheType = "none";

  @RestrictTo(RestrictTo.Scope.LIBRARY)
  public long renderTimeOrigin;

  public long fsRenderTime;

  public long callCreateFinishTime;

  public long interactionTime;

  /**
   * Time used for
   * {@link com.taobao.weex.bridge.WXBridgeManager#createInstance(String, String, Map, String)}
   */
  @RestrictTo(RestrictTo.Scope.LIBRARY)
  public long callCreateInstanceTime;


  public long fsCallJsTotalTime;

  public int fsCallJsTotalNum;

  public long fsCallNativeTotalTime;

  public int fsCallNativeTotalNum;

  public int fsRequestNum;

  public int fsComponentCount;

  public int fsComponentCreateTime;

  public int cellExceedNum;

  public int timerInvokeCount;

  public int fsCallEventTotalNum;

  public long avgFPS;
  public double fluency = 100D;

  public long backImproveMemory;


  /**
   * Time spent for reading, time unit is ms.
   */
  public double localReadTime;

  /**
   * Name of the page
   */
  public String pageName = DEFAULT;

  /**
   * Size of JavaScript framework, the unit is KB
   */
  public double JSLibSize;

  /**
   * Time of initial JavaScript library
   */
  public long JSLibInitTime;

  /**
   * Size of JavaScript template
   */
  public double JSTemplateSize;

  public long templateLoadTime;

  /**
   * Use {@link #callCreateInstanceTime} instead.
   */
  @Deprecated
  public long communicateTime;

  /**
   * Time spent when rendering first screen
   */
  public long screenRenderTime;

  /**
   * Call native Time spent when rendering first screen
   */
  public long callBridgeTime;

  /**
   * Create Instance Time spent when rendering first screen
   */
  public long firstScreenJSFExecuteTime;

  /**
   * Call native Time spent when rendering first screen
   */
  public long parseJsonTime;

  /**
   * CssLayout Time spent when rendering first screen
   */
  public long cssLayoutTime;

  /**
   * Time spent, the unit is micro second
   */
  public double totalTime;

  /**
   * load bundle js time, unite ms
   */
  public long networkTime;

  /**
   * pure network time;
   */
  public long pureNetworkTime;

  public long actualNetworkTime;
  public long packageSpendTime;
  public long syncTaskTime;
  /**
   * view hierarchy
   */
  public int maxDeepViewLayer;

  public int maxDeepVDomLayer;

  public double wrongImgSizeCount;

  /**
   * 1:true
   * 0:false
   */
  public int useScroller = 0;

  /**
   * component Count
   */
  public long componentCount;

  public long componentCreateTime;
  /**
   * Version of JavaScript libraray
   */
  public String JSLibVersion = WXEnvironment.JS_LIB_SDK_VERSION;

  /**
   * Version of Weex SDK
   */
  public String WXSDKVersion = WXEnvironment.WXSDK_VERSION;

  /**
   * The detail message of render failure
   */
  public String renderFailedDetail;

  /**
   * Error code
   */
  public String errCode;

  /**
   * Error message
   */
  @Deprecated
  public String errMsg;
  private StringBuilder mErrMsgBuilder;

  public String args="";

  public String connectionType;
  public String requestType="other";

  public String zCacheInfo;

  /**
   *for network tracker
   */

  /**
   * TODO These dimensions will be moved to elsewhere
   */
  @RestrictTo(RestrictTo.Scope.LIBRARY)
  @Deprecated
  public String wxDims[] = new String[5];

  /**
   * TODO These dimensions will be moved to elsewhere
   */
  @RestrictTo(RestrictTo.Scope.LIBRARY)
  @Deprecated
  public long measureTimes[] = new long[5];


  /**
   * RenderAction
   */
  public int mActionAddElementCount = 0;
  public int mActionAddElementSumTime = 0;

  public WXPerformance(){
    mErrMsgBuilder=new StringBuilder();
  }

  public static void init() {
  }

  public Map<String, Double> getMeasureMap() {
    double fsRenderTime;
    if (this.fsRenderTime != 0) {
      fsRenderTime = this.fsRenderTime - renderTimeOrigin;
    } else {
      if (totalTime != 0) {
        fsRenderTime = totalTime;
      } else {
        fsRenderTime = -1;
      }
    }
    Map<String, Double> quotas = new HashMap<>();
    quotas.put(Measure.JSLibSize.toString(), JSLibSize);
    quotas.put(Measure.JSLibInitTime.toString(), (double) JSLibInitTime);
    quotas.put(Measure.SDKInitTime.toString(), (double) WXEnvironment.sSDKInitTime);
    quotas.put(Measure.SDKInitInvokeTime.toString(), (double) WXEnvironment.sSDKInitInvokeTime);
    quotas.put(Measure.SDKInitExecuteTime.toString(), (double) WXEnvironment.sSDKInitExecuteTime);
    quotas.put(Measure.JSTemplateSize.toString(), JSTemplateSize);
    quotas.put(Measure.pureNetworkTime.toString(), (double) pureNetworkTime);
    quotas.put(Measure.networkTime.toString(), (double) networkTime);
    quotas.put(Measure.fsCreateInstanceTime.toString(), (double) (callCreateInstanceTime - renderTimeOrigin));
    quotas.put(Measure.fsCallJsTotalTime.toString(), (double) fsCallJsTotalTime);
    quotas.put(Measure.fsCallJsTotalNum.toString(), (double) fsCallJsTotalNum);
    quotas.put(Measure.fsCallNativeTotalTime.toString(), (double) fsCallNativeTotalTime);
    quotas.put(Measure.fsCallNativeTotalNum.toString(), (double) fsCallNativeTotalNum);
    quotas.put(Measure.fsComponentCount.toString(),(double)fsComponentCount);
    quotas.put(Measure.fsComponentCreateTime.toString(),(double)fsComponentCreateTime);
    quotas.put(Measure.fsRenderTime.toString(), fsRenderTime);
    quotas.put(Measure.fsRequestNum.toString(), (double) fsRequestNum);
    quotas.put(Measure.communicateTotalTime.toString(), totalTime);
    quotas.put(Measure.maxDeepViewLayer.toString(), (double) maxDeepViewLayer);
    quotas.put(Measure.maxDeepVDomLayer.toString(), (double) maxDeepVDomLayer);
    quotas.put(Measure.componentCount.toString(), (double) componentCount);
    quotas.put(Measure.componentCreateTime.toString(),(double)componentCreateTime);
    quotas.put(Measure.cellExceedNum.toString(), (double) cellExceedNum);
    quotas.put(Measure.timerCount.toString(), (double) timerInvokeCount);
    quotas.put(Measure.avgFps.toString(), (double) avgFPS);
    quotas.put(Measure.fluency.toString(), fluency);
    quotas.put(Measure.MaxImproveMemory.toString(), 0D);
    quotas.put(Measure.BackImproveMemory.toString(), (double) backImproveMemory);
    quotas.put(Measure.PushImproveMemory.toString(), 0D);

    quotas.put(Measure.fsCallEventTotalNum.toString(), (double) fsCallEventTotalNum);
    quotas.put(Measure.callCreateFinishTime.toString(), (double) callCreateFinishTime);
    quotas.put(Measure.imgSizeCount.toString(), wrongImgSizeCount);
    quotas.put(Measure.interactionTime.toString(), (double) interactionTime);

    quotas.put(Measure.callBridgeTime.toString(), (double) callBridgeTime);
    quotas.put(Measure.cssLayoutTime.toString(), (double) cssLayoutTime);
    quotas.put(Measure.parseJsonTime.toString(), (double) parseJsonTime);

    // TODO the following attribute is no longer needed and will be deleted soon.
    quotas.put(Measure.screenRenderTime.toString(), (double) screenRenderTime);
    quotas.put(Measure.communicateTime.toString(), (double) communicateTime);
    quotas.put(Measure.localReadTime.toString(), localReadTime);
    quotas.put(Measure.templateLoadTime.toString(), (double) templateLoadTime);
    quotas.put(Measure.firstScreenJSFExecuteTime.toString(), (double) firstScreenJSFExecuteTime);
    quotas.put(Measure.actualNetworkTime.toString(), (double) actualNetworkTime);
    quotas.put(Measure.syncTaskTime.toString(), (double) syncTaskTime);
    quotas.put(Measure.packageSpendTime.toString(), (double) packageSpendTime);

    // TODO These attribute will be moved to elsewhere
    quotas.put(Measure.measureTime1.toString(), (double) measureTimes[0]);
    quotas.put(Measure.measureTime2.toString(), (double) measureTimes[1]);
    quotas.put(Measure.measureTime3.toString(), (double) measureTimes[2]);
    quotas.put(Measure.measureTime4.toString(), (double) measureTimes[3]);
    quotas.put(Measure.measureTime5.toString(), (double) measureTimes[4]);
    return quotas;
  }

  public Map<String, String> getDimensionMap() {
    Map<String, String> quotas = new HashMap<>();
    quotas.put(Dimension.JSLibVersion.toString(), JSLibVersion);
    quotas.put(Dimension.WXSDKVersion.toString(), WXSDKVersion);
    quotas.put(Dimension.pageName.toString(), pageName);
    quotas.put(Dimension.requestType.toString(), requestType);
    quotas.put(Dimension.networkType.toString(), "unknown");
    quotas.put(Dimension.connectionType.toString(), connectionType);
    quotas.put(Dimension.zcacheInfo.toString(), zCacheInfo);
    quotas.put(Dimension.cacheType.toString(), cacheType);
    quotas.put(Dimension.useScroller.toString(), String.valueOf(useScroller));

    // TODO These attribute will be moved to elsewhere
    // Extra Dimension for 3rd developers.
    quotas.put(Dimension.wxdim1.toString(), wxDims[0]);
    quotas.put(Dimension.wxdim2.toString(), wxDims[1]);
    quotas.put(Dimension.wxdim3.toString(), wxDims[2]);
    quotas.put(Dimension.wxdim4.toString(), wxDims[3]);
    quotas.put(Dimension.wxdim5.toString(), wxDims[4]);

    // TODO the following attribute is no longer needed and will be deleted soon.
    quotas.put(Dimension.bizType.toString(), bizType);
    quotas.put(Dimension.templateUrl.toString(), templateUrl);
    return quotas;
  }

  public static String[] getDimensions() {
    List<String> ret = new LinkedList<>();
    for (Dimension dimension : Dimension.values()) {
      ret.add(dimension.toString());
    }
    return ret.toArray(new String[ret.size()]);
  }

  public static String[] getMeasures() {
    List<String> ret = new LinkedList<>();
    for (Measure measure : Measure.values()) {
      ret.add(measure.toString());
    }
    return ret.toArray(new String[ret.size()]);
  }

  @Override
  public String toString() {
    if (WXEnvironment.isApkDebugable()) {
      return "bizType:" + bizType + ",pageName:" + pageName + ",templateLoadTime" + templateLoadTime
              + ",localReadTime:" + localReadTime + ",JSLibInitTime:" + JSLibInitTime
              + ",JSLibSize:" + JSLibSize + ",templateUrl" + templateUrl
              + ",JSTemplateSize:" + JSTemplateSize + ",communicateTime:" + communicateTime
              + ",screenRenderTime:" + screenRenderTime
              + ",firstScreenJSFExecuteTime:" + firstScreenJSFExecuteTime
              + ",componentCount:" + componentCount
              + ",syncTaskTime:" + syncTaskTime
              + ",pureNetworkTime:" + pureNetworkTime
              + ",networkTime:" + networkTime
              + ",actualNetworkTime:" + actualNetworkTime
              + ",packageSpendTime:" + packageSpendTime
              + ",connectionType:" + connectionType
              + ",requestType:" + requestType
              + ",initInvokeTime:" + WXEnvironment.sSDKInitInvokeTime + ",initExecuteTime:" + WXEnvironment.sSDKInitExecuteTime
              + ",SDKInitTime:" + WXEnvironment.sSDKInitTime
              + ",totalTime:" + totalTime + ",JSLibVersion:" + JSLibVersion + ",WXSDKVersion:" + WXSDKVersion
              + ",errCode:" + errCode + ",renderFailedDetail:" + renderFailedDetail
              + ",arg:" + args
              + ",errMsg:" + getErrMsg();
    }
    return super.toString();
  }

  public String getPerfData() {
    return "networkTime:" + networkTime
            + " actualNetworkTime:" + actualNetworkTime
            + " connectionType:" + connectionType
            + " requestType:" + requestType
            + " firstScreenRenderTime:" + screenRenderTime
            + " firstScreenJSFExecuteTime:" + firstScreenJSFExecuteTime
            + " componentCount:" + componentCount
            + " JSTemplateSize:" + JSTemplateSize
            + " SDKInitTime:" + WXEnvironment.sSDKInitTime
            + " totalTime:" + totalTime
            + " JSLibVersion:" + JSLibVersion
            + " WXSDKVersion:" + WXSDKVersion
            + " pageName:" + pageName
            + " useScroller:" + useScroller;

  }

  public String getErrMsg() {
    return mErrMsgBuilder.toString();
  }

  public void appendErrMsg(CharSequence msg) {
    mErrMsgBuilder.append(msg);
  }

  public void beforeInstanceRender(String instanceId) {
    renderTimeOrigin = System.currentTimeMillis();
  }

  public void afterInstanceDestroy(String instanceId) {
  }
}
