package com.fujica.abk.api;

import com.fujica.abk.utils.Log;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import ohos.app.Context;
import ohos.data.DatabaseHelper;
import ohos.data.preferences.Preferences;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 缓存工具类
 */
public class cache {
    private static final String PREF_NAME = "fujicaV2";
    
    // 缓存键名
    public static final String KEY_TOKEN = "token";
    public static final String KEY_OPEN_ID = "open_id";
    public static final String KEY_PARK_CACHE = "park_cache";
    public static final String KEY_LATITUDE = "latitude";
    public static final String KEY_LONGITUDE = "longitude";
    public static final String KEY_LATITUDE_1 = "latitude_1";
    public static final String KEY_LONGITUDE_1 = "longitude_1";
    public static final String KEY_MOBILE = "mobile";
    // 临时车牌
    public static final String KEY_TMP_PLATE_NO = "tmp_plate_no";
    // 选中车牌
    public static final String KEY_PLATE_NO = "plate_no";
    // 项目历史记录
    public static final String KEY_PROJECT_HISTORY = "project_history";
    // 全局选中项目
    public static final String KEY_SELECTED_PROJECT = "selected_project";

    private static final Gson gson = new Gson();

    /**
     * 获取Preferences实例
     */
    private static Preferences getPref(Context context) {
        if (context == null) {
            return null;
        }
        try {
            DatabaseHelper databaseHelper = new DatabaseHelper(context.getApplicationContext());
            return databaseHelper.getPreferences(PREF_NAME);
        } catch (Exception e) {
            Log.error(e);
            return null;
        }
    }

    /**
     * 获取缓存值
     */
    public static String get(Context context, String key) {
        try {
            Preferences pref = getPref(context.getApplicationContext());
            if (pref != null && pref.hasKey(key)) {
                String val = pref.getString(key, "");
                return val == null ? "" : val;
            }
            return "";
        } catch (Exception e) {
            Log.error(e);
            return "";
        }
    }

    /**
     * 设置缓存值
     */
    public static void set(Context context, String key, String value) {
        try {
            Preferences pref = getPref(context.getApplicationContext());
            if (pref != null) {
                pref.putString(key, value);
                pref.flushSync();
            }
        } catch (Exception e) {
            Log.error(e);
        }
    }

    /**
     * 获取停车场缓存列表
     */
    public static List<Map<String, Object>> getParkCache(Context context) {
        String json = get(context, KEY_PARK_CACHE);
        if (json != null && !json.isEmpty()) {
            try {
                Type listType = new TypeToken<List<Map<String, Object>>>() {}.getType();
                return gson.fromJson(json, listType);
            } catch (Exception e) {
                Log.error(e);
            }
        }
        return new ArrayList<>();
    }

    /**
     * 设置停车场缓存列表
     */
    public static void setParkCache(Context context, List<Map<String, Object>> list) {
        if (list == null) {
            list = new ArrayList<>();
        }
        set(context, KEY_PARK_CACHE, gson.toJson(list));
    }

    /**
     * 获取浮点数
     */
    public static float getFloat(Context context, String key, Float defaultVal) {
        String val = get(context, key);
        if (val == null || val.isEmpty()) {
            return defaultVal != null ? defaultVal : 0f;
        }
        try {
            return Float.parseFloat(val);
        } catch (NumberFormatException e) {
            Log.error(e);
            return defaultVal != null ? defaultVal : 0f;
        }
    }

    /**
     * 获取纬度
     */
    public static float getLatitude(Context context) {
        return getFloat(context, KEY_LATITUDE, 22.58475573142116f);
    }

    /**
     * 获取经度
     */
    public static float getLongitude(Context context) {
        return getFloat(context, KEY_LONGITUDE, 113.95887627473346f);
    }

    /**
     * 设置纬度
     */
    public static void setLatitude(Context context, float value) {
        set(context, KEY_LATITUDE, String.valueOf(value));
    }

    /**
     * 设置经度
     */
    public static void setLongitude(Context context, float value) {
        set(context, KEY_LONGITUDE, String.valueOf(value));
    }

    /**
     * 获取纬度1
     */
    public static float getLatitude1(Context context) {
        return getFloat(context, KEY_LATITUDE_1, 22.58475573142116f);
    }

    /**
     * 获取经度1
     */
    public static float getLongitude1(Context context) {
        return getFloat(context, KEY_LONGITUDE_1, 113.95887627473346f);
    }

    /**
     * 设置纬度1
     */
    public static void setLatitude1(Context context, float value) {
        set(context, KEY_LATITUDE_1, String.valueOf(value));
    }

    /**
     * 设置经度1
     */
    public static void setLongitude1(Context context, float value) {
        set(context, KEY_LONGITUDE_1, String.valueOf(value));
    }

    /**
     * 获取Token
     */
    public static String getToken(Context context) {
        return get(context, KEY_TOKEN);
    }

    /**
     * 设置Token
     */
    public static void setToken(Context context, String value) {
        set(context, KEY_TOKEN, value);
    }

    /**
     * 获取OpenId
     */
    public static String getOpenId(Context context) {
        return get(context, KEY_OPEN_ID);
    }

    /**
     * 设置OpenId
     */
    public static void setOpenId(Context context, String value) {
        set(context, KEY_OPEN_ID, value);
    }

    /**
     * 获取手机号
     */
    public static String getMobile(Context context) {
        return get(context, KEY_MOBILE);
    }

    /**
     * 设置手机号
     */
    public static void setMobile(Context context, String value) {
        set(context, KEY_MOBILE, value);
    }

    /**
     * 登出，清除相关缓存
     */
    public static void logout(Context context) {
        try {
            Preferences pref = getPref(context);
            if (pref != null) {
                pref.delete(KEY_TOKEN);
                pref.delete(KEY_MOBILE);
                pref.delete(KEY_OPEN_ID);
                pref.flushSync();
            }
        } catch (Exception e) {
            Log.error(e);
        }
    }

    /**
     * 判断是否已认证
     */
    public static boolean isAuth(Context context) {
        String token = getToken(context);
        return token != null && !token.isEmpty();
    }

    /**
     * 获取临时车牌号
     */
    public static String getTmpPlateNo(Context context) {
        return get(context, KEY_TMP_PLATE_NO);
    }

    /**
     * 设置临时车牌号
     */
    public static void setTmpPlateNo(Context context, String value) {
        set(context, KEY_TMP_PLATE_NO, value);
    }

    /**
     * 获取车牌号
     */
    public static String getPlateNo(Context context) {
        return get(context, KEY_PLATE_NO);
    }

    /**
     * 设置车牌号
     */
    public static void setPlateNo(Context context, String value) {
        set(context, KEY_PLATE_NO, value);
    }

    /**
     * 获取项目历史记录
     */
    public static List<Map<String, Object>> getProjectHistory(Context context) {
        String json = get(context, KEY_PROJECT_HISTORY);
        if (json != null && !json.isEmpty()) {
            try {
                Type listType = new TypeToken<List<Map<String, Object>>>() {}.getType();
                return gson.fromJson(json, listType);
            } catch (Exception e) {
                Log.error(e);
            }
        }
        return new ArrayList<>();
    }

    /**
     * 添加项目历史记录（最多保存5个）
     */
    public static void addProjectHistory(Context context, Map<String, Object> project) {
        List<Map<String, Object>> list = getProjectHistory(context);
        
        // 移除已存在的相同项目（根据 projectNo 判断）
        if (project != null && project.containsKey("projectNo")) {
            Object projectNo = project.get("projectNo");
            List<Map<String, Object>> filteredList = new ArrayList<>();
            for (Map<String, Object> item : list) {
                if (item != null && !projectNo.equals(item.get("projectNo"))) {
                    filteredList.add(item);
                }
            }
            list = filteredList;
        }
        
        // 将新项目添加到开头
        if (project != null) {
            list.add(0, project);
        }
        
        // 最多保留5个
        if (list.size() > 5) {
            list = list.subList(0, 5);
        }
        
        set(context, KEY_PROJECT_HISTORY, gson.toJson(list));
    }

    /**
     * 清空项目历史记录
     */
    public static void clearProjectHistory(Context context) {
        try {
            Preferences pref = getPref(context);
            if (pref != null) {
                pref.delete(KEY_PROJECT_HISTORY);
                pref.flushSync();
            }
        } catch (Exception e) {
            Log.error(e);
        }
    }

    /**
     * 获取全局选中的项目
     */
    public static Map<String, Object> getSelectedProject(Context context) {
        String json = get(context, KEY_SELECTED_PROJECT);
        if (json != null && !json.isEmpty()) {
            try {
                Type mapType = new TypeToken<Map<String, Object>>() {}.getType();
                return gson.fromJson(json, mapType);
            } catch (Exception e) {
                Log.error(e);
            }
        }
        return null;
    }

    /**
     * 设置全局选中的项目
     */
    public static void setSelectedProject(Context context, Map<String, Object> project) {
        if (project != null) {
            set(context, KEY_SELECTED_PROJECT, gson.toJson(project));
        }
    }

    /**
     * 清空全局选中的项目
     */
    public static void clearSelectedProject(Context context) {
        try {
            Preferences pref = getPref(context);
            if (pref != null) {
                pref.delete(KEY_SELECTED_PROJECT);
                pref.flushSync();
            }
        } catch (Exception e) {
            Log.error(e);
        }
    }

    // ========== 以下为兼容旧代码的方法 ==========

    /**
     * 获取车牌号（兼容旧代码）
     */
    public static String getLicensePlate(Context context) {
        return "粤B11111";
//        return getPlateNo(context);
    }

    /**
     * 保存车牌号（兼容旧代码）
     */
    public static void setLicensePlate(Context context, String licensePlate) {
        setPlateNo(context, licensePlate);
    }

    /**
     * 清除车牌相关缓存
     */
    public static void clearLicensePlate(Context context) {
        try {
            Preferences preferences = getPref(context);
            if (preferences != null) {
                preferences.delete(KEY_PLATE_NO);
                preferences.delete("parking_status");
                preferences.flushSync();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
