# frozen_string_literal: true

require 'digest'
require 'json'
require 'securerandom'
require_relative '../config/database'

# 确保数据库连接已建立并设置全局Sequel模型数据库
Database.connection

# 自定义集成代码模型
# 数据流：云端 -> 客户端（服务器版本），用户可编辑（用户版本）
# 逻辑：如果用户版本存在，就用用户版本；否则用服务器版本
class CustomIntegrationCode < Sequel::Model(:custom_integration_codes)
  plugin :timestamps, update_on_create: true
  plugin :validation_helpers

  # 创建前生成UUID
  def before_create
    self.id ||= SecureRandom.uuid
    super
  end

  # 验证
  def validate
    super
    validates_presence [:server_version_hash, :server_code]
  end

  # 获取当前使用的代码（用户版本优先）
  def current_code
    user_code && !user_code.empty? ? user_code : server_code
  end

  # 获取当前版本哈希
  def current_version_hash
    user_version_hash && !user_version_hash.empty? ? user_version_hash : server_version_hash
  end

  # 是否使用用户版本
  def using_user_version?
    user_code && !user_code.empty?
  end

  # 更新服务器版本（从云端同步）
  def update_server(code, version_hash, updated_at = Time.now)
    self.server_code = code
    self.server_version_hash = version_hash
    self.server_updated_at = updated_at
    self.last_synced_at = Time.now

    # 如果用户版本为空，用服务器版本初始化用户版本
    if (user_code.nil? || user_code.empty?) && code && !code.empty?
      self.user_code = code
      self.user_version_hash = version_hash
      self.user_updated_at = Time.now
      add_history(version_hash, code, "从服务器版本初始化")
    end

    save
  end

  # 保存用户版本（编辑）
  def save_user(code, notes = nil)
    return false if code.nil? || code.empty?

    puts "[CustomIntegration] 开始保存用户版本，代码长度: #{code.length}, 备注: #{notes || '无'}"

    # 生成版本哈希
    version_hash = Digest::MD5.hexdigest(code)
    puts "[CustomIntegration] 生成版本哈希: #{version_hash[0..8]}..."

    # 如果已有用户版本，保存到历史
    if using_user_version?
      puts "[CustomIntegration] 已有用户版本，保存编辑前历史"
      add_history(user_version_hash, user_code, "编辑前")
    end

    # 更新用户版本
    self.user_version_hash = version_hash
    self.user_code = code
    self.user_updated_at = Time.now

    # 添加到历史
    puts "[CustomIntegration] 添加当前版本到历史"
    add_history(version_hash, code, notes)

    puts "[CustomIntegration] 调用save方法..."
    result = save
    puts "[CustomIntegration] save方法返回: #{result}"

    # 如果保存失败，打印错误
    unless result
      puts "[CustomIntegration] 保存失败，验证错误: #{errors.full_messages.join(', ')}" if errors.any?
    end

    result
  end

  # 确保metadata是Hash
  def metadata_hash
    if metadata.is_a?(String) && !metadata.empty?
      begin
        JSON.parse(metadata)
      rescue JSON::ParserError
        {}
      end
    elsif metadata.is_a?(Hash)
      metadata
    else
      {}
    end
  end

  # 获取编辑历史
  def history
    # 使用最新的metadata数据
    refresh if exists?

    metadata_hash['history'] || []
  end

  # 添加编辑历史记录
  def add_history(version_hash, code, notes = nil)
    meta = metadata_hash
    meta['history'] ||= []

    history_entry = {
      version_hash: version_hash,
      timestamp: Time.now.iso8601,
      code_preview: code, # 保存完整代码以便查看
      notes: notes,
      length: code.length
    }

    # 添加到历史，限制最多10条
    meta['history'].unshift(history_entry)
    meta['history'] = meta['history'][0..9]

    # 调试日志
    puts "[CustomIntegration] 添加历史记录: #{version_hash[0..8]}... - #{notes || '无备注'} - 代码长度: #{code.length}"
    puts "  历史记录总数: #{meta['history'].length}"

    # 更新metadata
    self.metadata = meta
  end

  # 清空用户版本（恢复使用服务器版本）
  def clear_user!
    # 保存当前用户版本到历史
    if using_user_version?
      add_history(user_version_hash, user_code, "清空前")
    end

    self.user_version_hash = nil
    self.user_code = nil
    self.user_updated_at = nil

    save
  end

  # 序列化metadata
  def before_save
    if metadata.is_a?(Hash)
      self.metadata = metadata.to_json
    end
    super
  end

  # 反序列化metadata
  def after_load
    if metadata.is_a?(String) && !metadata.empty?
      begin
        self.metadata = JSON.parse(metadata)
      rescue JSON::ParserError
        self.metadata = {}
      end
    elsif metadata.nil?
      self.metadata = {}
    end
    super
  end

  # 类方法：获取当前记录（单例）
  def self.current
    first || create_default
  end

  # 创建默认记录
  def self.create_default
    create(
      server_version_hash: 'default',
      server_code: '# 默认自定义集成代码（空）',
      server_updated_at: Time.now,
      last_synced_at: Time.now,
      metadata: { 'history' => [] }
    )
  end

  # 获取当前代码
  def self.current_code
    current&.current_code || '# 自定义集成代码不可用'
  end

  # 更新服务器版本
  def self.update_server(code, version_hash, updated_at = Time.now)
    current.update_server(code, version_hash, updated_at)
  end

  # 保存用户版本
  def self.save_user(code, notes = nil)
    current.save_user(code, notes)
  end

  # 获取历史
  def self.history
    # 直接查询数据库，避免任何实例缓存问题
    record = first
    return [] unless record

    puts "[CustomIntegration.history] 获取记录ID: #{record.id}"

    # 确保使用最新的数据库数据
    record.refresh

    # 从metadata字段解析历史
    metadata = record[:metadata]
    puts "[CustomIntegration.history] metadata类型: #{metadata.class}, 长度: #{metadata.to_s.length}"

    if metadata.is_a?(String) && !metadata.empty?
      begin
        metadata_hash = JSON.parse(metadata)
        history_data = metadata_hash['history'] || []
        puts "[CustomIntegration.history] 解析到历史记录数量: #{history_data.length}"
        return history_data
      rescue JSON::ParserError => e
        puts "[CustomIntegration.history] 解析metadata失败: #{e.message}"
        return []
      end
    elsif metadata.is_a?(Hash)
      history_data = metadata['history'] || []
      puts "[CustomIntegration.history] Hash中历史记录数量: #{history_data.length}"
      return history_data
    else
      puts "[CustomIntegration.history] metadata为空或无效"
      return []
    end
  end

  # 获取状态信息
  def self.status
    record = current
    return {} unless record

    {
      server_version_hash: record.server_version_hash,
      server_updated_at: record.server_updated_at&.iso8601,
      using_user_version: record.using_user_version?,
      user_version_hash: record.user_version_hash,
      user_updated_at: record.user_updated_at&.iso8601,
      last_synced_at: record.last_synced_at&.iso8601,
      history_count: record.history.length
    }
  end

  # 清空用户版本
  def self.clear_user!
    current&.clear_user!
  end
end