# SaaS授权系统 - Ruby客户端
#
# 使用说明：
# 1. 修改 API_KEY 为您的真实API密钥
# 2. 在您的项目中引入：require 'authorization_client'
# 3. 调用验证：AuthorizationClient.verify('AUTH_CODE')
#
# 依赖：Ruby 2.7+ (内置 net/http, json)
# 可选 gem: require 'faraday'
#
# @author 授权系统
# @version 1.0.0

require 'net/http'
require 'json'
require 'uri'
require 'time'

class AuthorizationClient
  # ==================== 配置区 ====================
  
  # API密钥（从开发者中心获取）
  # 网址：https://kuio.cn/user/developer
  @@api_key = 'your_api_key_here'
  
  # API接口地址
  @@base_url = 'https://kuio.cn/api/saas'
  
  # 缓存配置
  @@cache_enabled = true
  @@cache_duration = 1800 # 缓存时间（秒）30分钟
  
  @@cache = {}
  @@cache_time = {}

  class << self
    attr_accessor :api_key, :base_url, :cache_enabled, :cache_duration
    
    # ==================== 核心方法 ====================
    
    # 验证授权（带缓存）
    #
    # @param authcode [String] 授权码
    # @param domain [String, nil] 域名（可选）
    # @param ip [String, nil] IP地址（可选）
    # @return [Hash] {success:, message:, data:, from_cache:}
    def verify(authcode, domain: nil, ip: nil)
      # 1. 尝试从缓存读取
      if @@cache_enabled && @@cache.key?(authcode)
        cached_time = @@cache_time[authcode] || 0
        if Time.now.to_i - cached_time < @@cache_duration
          return {
            success: true,
            message: '授权验证成功（缓存）',
            data: @@cache[authcode],
            from_cache: true
          }
        end
        @@cache.delete(authcode)
      end
      
      # 2. 调用API验证
      result = verify_from_api(authcode, domain, ip)
      
      # 3. 成功则写入缓存
      if result[:success] && @@cache_enabled
        @@cache[authcode] = result[:data]
        @@cache_time[authcode] = Time.now.to_i
      end
      
      result
    end
    
    # 从API验证授权（不使用缓存）
    def verify_from_api(authcode, domain, ip)
      uri = URI("#{@@base_url}/verify")
      
      body = { authcode: authcode }
      body[:domain] = domain if domain && !domain.empty?
      body[:ip] = ip if ip && !ip.empty?
      
      http = Net::HTTP.new(uri.host, uri.port)
      http.use_ssl = uri.scheme == 'https'
      http.open_timeout = 10
      http.read_timeout = 10
      
      request = Net::HTTP::Post.new(uri.path)
      request['Content-Type'] = 'application/json'
      request['X-API-Key'] = @@api_key
      request['User-Agent'] = 'Ruby-AuthClient/1.0'
      request.body = body.to_json
      
      response = http.request(request)
      response_body = JSON.parse(response.body)
      
      if response.code == '200' && response_body['code'] == 0
        {
          success: true,
          message: response_body['msg'] || '授权验证成功',
          data: response_body['data'].to_json,
          from_cache: false
        }
      else
        {
          success: false,
          message: response_body['msg'] || '授权验证失败',
          data: '',
          from_cache: false,
          code: response_body['code'] || -1,
          http_code: response.code.to_i
        }
      rescue StandardError => e
        {
          success: false,
          message: "网络请求失败: #{e.message}",
          data: '',
          from_cache: false
        }
      end
    end
    
    # 快速检查（仅返回true/false）
    def check(authcode)
      result = verify(authcode)
      result[:success]
    end
    
    # 清除缓存
    def clear_cache!
      @@cache.clear
      @@cache_time.clear
    end
  end
end

# ========== 使用示例 ==========

=begin
# 创建/配置客户端
AuthorizationClient.api_key = 'your_api_key_here'

# 示例1：基础验证
result = AuthorizationClient.verify('ABC123XYZ')

if result[:success]
  puts "✅ 授权验证成功！"
  puts "消息：#{result[:message]}"
  puts "数据：#{result[:data]}"
else
  puts "❌ 授权验证失败：#{result[:message]}"
end

# 示例2：带域名的验证
result2 = AuthorizationClient.verify('ABC123XYZ', domain: 'example.com')

# 示例3：快速检查
if AuthorizationClient.check('CODE')
  puts "✅ 授权有效"
end

# 示例4：清除缓存
AuthorizationClient.clear_cache!

# 示例5：在Rails中使用
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :verify_license
  
  private
  
  def verify_license
    auth_code = params[:authcode] || session[:authcode]
    
    unless AuthorizationClient.check(auth_code)
      render json: { error: '授权验证失败', message: '无效的授权码' }, status: :forbidden
    end
  end
end
=end
