package com.example.iot_controlhost.utils.log;

import static com.example.iot_controlhost.utils.log.UserLog.TAG_USER_OPERATE;
import static com.example.iot_controlhost.utils.log.UserLog.TAG_USER_SENSOR;
import static com.example.iot_controlhost.utils.log.UserLog.TAG_USER_SYSTEM;
import static com.example.iot_controlhost.utils.log.UserLog.TAG_USER_TASK;

import android.util.Log;

import com.example.iot_controlhost.utils.database.LogDBManager;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import timber.log.Timber;

public class MyLog extends Timber.Tree {
    public static final String TAG_ERROR = "Error";
    /**
     * 测试类
     */
    public static final String TAG_TEST = "调试";
    /**
     * 预警类
     */
    public static final String TAG_WARNING = "预警";

    /**
     * 传感器类
     */
    public static final String TAG_SENSOR = "传感器";

    /**
     * 控制器类
     */
    public static final String TAG_CONTROLLER = "控制器";

    /**
     * 网络类
     */
    public static final String TAG_NETWORK = "网络";

    /**
     * 系统类
     */
    public static final String TAG_APP = "系统";

    /**
     * 远程控制类
     */
    public static final String TAG_REMOTE = "远程控制";

    /**
     * 自动控制类
     */
    public static final String TAG_AUTO = "自动控制";
    /**
     * 人脸识别类
     */
    public static final String TAG_FACE = "人脸识别";
    /**
     * 远程控制
     */
    public static final String TAG_FRP = "远程协助";

    public static List<String> getUserQueryTag() {
        return getSystemLogTags();
    }

    /**
     * 系统诊断日志的全部落库标签，包含普通和错误级别。
     */
    public static List<String> getSystemLogTags() {
        List<String> tags = new ArrayList<>();
        List<String> baseTags = new ArrayList<>();
        Collections.addAll(baseTags, TAG_TEST, TAG_WARNING, TAG_SENSOR, TAG_CONTROLLER, TAG_NETWORK,
                TAG_APP, TAG_REMOTE, TAG_AUTO, TAG_FACE, TAG_FRP);
        for (String tag : baseTags) {
            tags.add(tag);
            tags.add(tag + TAG_ERROR);
        }
        return tags;
    }

    public static void test(String msg) {
        Timber.tag(TAG_TEST).i(msg);
    }

    public static void auto(String msg) {
        Timber.tag(TAG_AUTO).i(msg);
    }

    public static void autoError(String msg) {
        Timber.tag(TAG_AUTO + TAG_ERROR).e(msg);
    }

    public static void warning(String msg) {
        Timber.tag(TAG_WARNING).i(msg);
    }

    public static void warningError(String msg) {
        Timber.tag(TAG_WARNING + TAG_ERROR).e(msg);
    }

    public static void sensor(String msg) {
        Timber.tag(TAG_SENSOR).i(msg);
    }

    public static void sensorError(String msg) {
        Timber.tag(TAG_SENSOR + TAG_ERROR).e(msg);
    }

    public static void controller(String msg) {
        Timber.tag(TAG_CONTROLLER).i(msg);
    }

    public static void controllerError(String msg) {
        Timber.tag(TAG_CONTROLLER + TAG_ERROR).e(msg);
    }

    public static void network(String msg) {
        Timber.tag(TAG_NETWORK).i(msg);
    }

    public static void networkError(String msg) {
        Timber.tag(TAG_NETWORK + TAG_ERROR).e(msg);
    }

    public static void app(String msg) {
        Timber.tag(TAG_APP).i(msg);
    }

    public static void appError(String msg) {
        Timber.tag(TAG_APP + TAG_ERROR).e(msg);
    }

    public static void remote(String msg) {
        Timber.tag(TAG_REMOTE).i(msg);
    }

    public static void remoteError(String msg) {
        Timber.tag(TAG_REMOTE + TAG_ERROR).e(msg);
    }

    public static void face(String msg) {
        Timber.tag(TAG_FACE).i(msg);
    }

    public static void faceError(String msg) {
        Timber.tag(TAG_FACE + TAG_ERROR).e(msg);
    }

    public static void frp(String msg) {
        Timber.tag(TAG_FRP).i(msg);
    }

    public static void frpError(String msg) {
        Timber.tag(TAG_FRP + TAG_ERROR).e(msg);
    }

    @Override
    protected void log(int priority, String tag, String message, Throwable t) {
        // 不处理UserLog日志
        if (tag == null || tag.contains(TAG_USER_OPERATE) || tag.contains(TAG_USER_SENSOR)
                || tag.contains(TAG_USER_TASK) || tag.contains(TAG_USER_SYSTEM)) {
            return;
        }
        // 控制台立即输出，数据库写入由日志单线程异步处理，避免重复切换IO线程。
        Log.println(priority, tag, message);
        LogDBManager.insertLog(new com.example.iot_controlhost.model.Log(tag, priority, new Date(), message));
    }

}
