package com.hikoncont.util

import android.content.Context
import android.util.Log
import org.json.JSONObject
import java.io.File
import java.io.FileWriter
import java.io.IOException

/**
 * 配置文件写入工具类
 * 用于写入和更新server_config.json文件
 */
object ConfigWriter {
    
    private const val TAG = "ConfigWriter"
    private const val CONFIG_FILE_NAME = "server_config.json"
    
    /**
     * 更新服务器URL配置
     * @param context 上下文
     * @param newServerUrl 新的服务器URL
     * @return 是否更新成功
     */
    fun updateServerUrl(context: Context, newServerUrl: String): Boolean {
        return try {
            Log.i(TAG, "开始更新服务器URL: $newServerUrl")
            
            // 读取现有配置
            val existingConfig = readExistingConfig(context)
            
            // 更新serverUrl字段
            existingConfig.put("serverUrl", newServerUrl)
            
            // 写入文件
            val success = writeConfigToFile(context, existingConfig)
            
            if (success) {
                Log.i(TAG, "✅ 服务器URL更新成功: $newServerUrl")
            } else {
                Log.e(TAG, "❌ 服务器URL更新失败")
            }
            
            success
        } catch (e: Exception) {
            Log.e(TAG, "更新服务器URL时发生异常", e)
            false
        }
    }
    
    /**
     * 读取现有配置文件
     * 优先读取内部存储的配置文件，如果不存在则读取assets默认配置
     */
    private fun readExistingConfig(context: Context): JSONObject {
        return try {
            // 1. 优先读取内部存储的配置文件（用户修改过的配置）
            val internalConfigFile = File(context.filesDir, CONFIG_FILE_NAME)
            if (internalConfigFile.exists()) {
                val jsonString = internalConfigFile.readText()
                val config = JSONObject(jsonString)
                Log.d(TAG, "✅ 从内部存储读取现有配置")
                return config
            }
            
            // 2. 如果内部存储没有配置文件，则读取assets目录的默认配置
            Log.d(TAG, "⚠️ 内部存储配置文件不存在，读取assets默认配置")
            val inputStream = context.assets.open(CONFIG_FILE_NAME)
            val jsonString = inputStream.bufferedReader().use { it.readText() }
            inputStream.close()
            
            val config = JSONObject(jsonString)
            Log.d(TAG, "✅ 从assets读取默认配置")
            config
        } catch (e: Exception) {
            Log.w(TAG, "❌ 无法读取现有配置，创建默认配置", e)
            // 如果无法读取，创建默认配置
            createDefaultConfig()
        }
    }
    
    /**
     * 创建默认配置
     */
    private fun createDefaultConfig(): JSONObject {
        return JSONObject().apply {
            put("serverUrl", "ws://192.168.10.205:3001")
            put("webUrl", "https://m.baidu.com")
            put("buildTime", System.currentTimeMillis().toString())
            put("version", "1.0.0")
            put("enableConfigMask", false)
            put("enableProgressBar", true)
            put("configMaskText", "配置中请稍后...")
            put("configMaskSubtitle", "正在自动配置和连接\n请勿操作设备")
            put("configMaskStatus", "配置完成后将自动返回应用")
        }
    }
    
    /**
     * 将配置写入文件 - 使用小米设备优化策略
     */
    private fun writeConfigToFile(context: Context, config: JSONObject): Boolean {
        return try {
            val configContent = config.toString(2) // 格式化JSON
            
            // 使用小米设备优化的文件写入方法
            val success = XiaomiFileUtils.safeWriteToFile(context, CONFIG_FILE_NAME, configContent)
            
            if (success) {
                Log.i(TAG, "✅ 配置已写入文件: $CONFIG_FILE_NAME")
            } else {
                Log.e(TAG, "❌ 配置写入失败: $CONFIG_FILE_NAME")
            }
            
            success
        } catch (e: Exception) {
            Log.e(TAG, "❌ 写入配置文件时发生异常", e)
            // 创建异常日志
            XiaomiFileUtils.createExceptionLog(context, e, "配置文件写入失败")
            false
        }
    }
    
    /**
     * 获取当前配置的服务器URL
     */
    fun getCurrentServerUrl(context: Context): String? {
        return try {
            val configFile = File(context.filesDir, CONFIG_FILE_NAME)
            if (configFile.exists()) {
                val jsonString = configFile.readText()
                val config = JSONObject(jsonString)
                config.optString("serverUrl")
            } else {
                null
            }
        } catch (e: Exception) {
            Log.e(TAG, "读取当前服务器URL失败", e)
            null
        }
    }
    
    /**
     * 检查配置文件是否存在
     */
    fun isConfigFileExists(context: Context): Boolean {
        val configFile = File(context.filesDir, CONFIG_FILE_NAME)
        return configFile.exists()
    }
}
