import datetime
import os
import threading

from django.conf import settings

# from apps.log_service.services import log_service
# 日志管理系统使用说明
# # 持久型日志（自动行数管理，最多保留500行）
# log_service.write_log('user_activity_123', '用户登录系统', log_type='persistent')
# log_service.write_log('user_activity_123', '用户查看产品列表', log_type='persistent')

# # 追踪型日志（任务进度跟踪）
# log_service.write_log('data_import_789', '开始导入数据', log_type='track')
# log_service.write_log('data_import_789', '读取文件完成: 1000条记录', log_type='track')
# log_service.write_log('data_import_789', '处理中: 50%', log_type='track')
# log_service.write_log('data_import_789', '导入完成: 100%', log_type='track')
# <!-- 在任意模板中 -->
# <button class="btn btn-info" onclick="showLogModal('user_activity_123')">
#     查看活动日志
# </button>

# <button class="btn btn-primary" onclick="showLogModal('data_import_789', {showProgress: true, refreshInterval: 1000})">
#     查看导入进度
# </button>

# <!-- 包含日志模态框组件 -->
# {% include "admin/log_service/log_modals.html" %}


class LogService:

    def __init__(self):
        self.log_dir = os.path.join(settings.BASE_DIR, 'logs')
        if not os.path.exists(self.log_dir):
            os.makedirs(self.log_dir)

    def _get_file_path(self, task_id):
        """获取日志文件路径"""
        return os.path.join(self.log_dir, f"{task_id}.txt")

    def clear(self, task_id):
        """
        清除指定task_id的日志文件（增强版）
        :param task_id: 要清除的任务ID
        :return: (success: bool, message: str)
        """
        file_path = self._get_file_path(task_id)

        try:
            if os.path.exists(file_path):
                os.remove(file_path)
                return True, f"成功清除日志文件: {file_path}"
            else:
                return True, f"日志文件不存在: {file_path}"
        except PermissionError:
            error_msg = f"权限不足，无法删除日志文件: {file_path}"
            print(error_msg)
            return False, error_msg
        except Exception as e:
            error_msg = f"清除日志文件失败 {file_path}: {str(e)}"
            print(error_msg)
            return False, error_msg

    def write_log(self,
                  task_id,
                  message,
                  log_type='persistent',
                  max_lines=500):
        """
        智能写入日志
        :param task_id: 任务ID
        :param message: 日志消息
        :param log_type: 日志类型 'persistent'持久或 'track'追踪
        :param max_lines: 最大行数（仅持久模式有效）
        """
        file_path = self._get_file_path(task_id)
        timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        message = f"{timestamp}：{message}"
        try:

            if log_type == 'track':
                # 追踪类型：不存在则创建，存在则追加（不清空）
                mode = 'a' if os.path.exists(file_path) else 'w'
                with open(file_path, mode, encoding='utf-8') as f:
                    f.write(f"{message}\n")
            else:
                # 持久类型：智能行数管理
                if not os.path.exists(file_path):
                    # 文件不存在，创建新文件
                    with open(file_path, 'w', encoding='utf-8') as f:
                        f.write(f"{message}\n")
                else:
                    # 文件存在，检查行数并管理
                    with open(file_path, 'r+', encoding='utf-8') as f:
                        lines = f.readlines()

                        # 检查是否超过最大行数限制
                        if len(lines) >= max_lines:
                            # 保留最近max_lines-1行
                            lines = lines[-(max_lines - 1):]

                        # 添加新消息
                        lines.append(f"{message}\n")

                        # 写回文件
                        f.seek(0)
                        f.writelines(lines)
                        f.truncate()
        except Exception as e:
            print('Logservice.write_log Error:', e)

    def read_log(self, task_id, last_n_lines=None):
        """
        读取日志
        :param task_id: 任务ID
        :param last_n_lines: 读取最后N行，None表示全部读取
        :return: 日志内容列表
        """
        file_path = self._get_file_path(task_id)

        if not os.path.exists(file_path):
            return []

        with open(file_path, 'r', encoding='utf-8') as f:
            lines = f.readlines()

            if last_n_lines and len(lines) > last_n_lines:
                return lines[-last_n_lines:]
            return lines

    def log_exists(self, task_id):
        """检查日志是否存在"""
        return os.path.exists(self._get_file_path(task_id))


# 全局实例
log_service = LogService()
