<?php
/**
 * AI Post 统一日志工具类
 *
 * 提供分级日志输出，通过插件设置中的 enable-debug-log 开关控制 DEBUG 级日志。
 * WARNING / ERROR 级别始终输出，不受开关影响。
 *
 * 用法：
 *   Logger::debug('消息');           // 仅在调试开关开启时输出
 *   Logger::info('消息');            // 仅在调试开关开启时输出
 *   Logger::warning('消息');         // 始终输出
 *   Logger::error('消息');           // 始终输出
 *
 * @package AI-Post
 * @since 2.9.1
 */

namespace HaoZiTeam\AIPost\Service\Features;

defined('ABSPATH') || exit;

class Logger
{
    /** 日志级别常量（数值越大越严重） */
    const LEVEL_DEBUG   = 0;
    const LEVEL_INFO    = 1;
    const LEVEL_WARNING = 2;
    const LEVEL_ERROR   = 3;

    /** @var bool|null 调试开关缓存（避免每次读 option） */
    private static $debug_enabled = null;

    /** @var string 日志前缀 */
    private static $prefix = '[AI-Post]';

    /**
     * DEBUG 级别日志 —— 仅在调试开关开启时输出
     * 用于开发阶段的追踪信息，如任务源、频率决策、SSL诊断等。
     */
    public static function debug(string $message, string $tag = ''): void
    {
        self::log(self::LEVEL_DEBUG, $message, $tag);
    }

    /**
     * INFO 级别日志 —— 仅在调试开关开启时输出
     * 用于常规运行信息，如成功生成文章、图片插入等。
     */
    public static function info(string $message, string $tag = ''): void
    {
        self::log(self::LEVEL_INFO, $message, $tag);
    }

    /**
     * WARNING 级别日志 —— 始终输出
     * 用于非致命但需关注的情况，如回退、降级等。
     */
    public static function warning(string $message, string $tag = ''): void
    {
        self::log(self::LEVEL_WARNING, $message, $tag);
    }

    /**
     * ERROR 级别日志 —— 始终输出
     * 用于错误和异常。
     */
    public static function error(string $message, string $tag = ''): void
    {
        self::log(self::LEVEL_ERROR, $message, $tag);
    }

    /**
     * 核心日志方法
     */
    private static function log(int $level, string $message, string $tag = ''): void
    {
        // DEBUG 和 INFO 级别受调试开关控制
        if ($level < self::LEVEL_WARNING && !self::is_debug_enabled()) {
            return;
        }

        $level_label = self::level_label($level);
        $tag_str = ($tag !== '') ? "[{$tag}]" : '';
        \error_log(self::$prefix . "[{$level_label}]{$tag_str} {$message}");
    }

    /**
     * 判断调试开关是否开启（带运行时缓存）
     */
    private static function is_debug_enabled(): bool
    {
        if (self::$debug_enabled !== null) {
            return self::$debug_enabled;
        }

        // 常量级强制开启（开发环境）
        if (defined('WP_AIPOST_DEBUG') && WP_AIPOST_DEBUG) {
            self::$debug_enabled = true;
            return true;
        }

        // 读取插件设置中的开关
        try {
            if (!function_exists('get_option')) {
                self::$debug_enabled = false;
                return false;
            }
            $opts = get_option('ai-post', []);
            if (!is_array($opts)) {
                self::$debug_enabled = false;
                return false;
            }

            // 兼容旧版（字段在顶层）
            if (!empty($opts['enable-debug-log'])) {
                self::$debug_enabled = true;
                return true;
            }
            // 新版：字段位于 global_tabs 中
            if (!empty($opts['global_tabs']) && is_array($opts['global_tabs'])) {
                if (!empty($opts['global_tabs']['enable-debug-log'])) {
                    self::$debug_enabled = true;
                    return true;
                }
            }
        } catch (\Throwable $e) {
            // 读取失败时默认关闭调试
        }

        self::$debug_enabled = false;
        return false;
    }

    /**
     * 重置缓存（当设置变更时调用）
     */
    public static function reset_cache(): void
    {
        self::$debug_enabled = null;
    }

    /**
     * 级别标签
     */
    private static function level_label(int $level): string
    {
        switch ($level) {
            case self::LEVEL_DEBUG:   return 'DEBUG';
            case self::LEVEL_INFO:    return 'INFO';
            case self::LEVEL_WARNING: return 'WARN';
            case self::LEVEL_ERROR:   return 'ERROR';
            default:                  return 'LOG';
        }
    }
}
