import type { TodoItem } from '../../session/storage/todo.js';
import type { SessionManager } from '../../session/index.js';

// 兼容旧接口的 Todo 类型
export type Todo = {
  id: string;
  content: string;
  status: 'pending' | 'in_progress' | 'completed';
  createdAt: string;
  updatedAt: string;
};

export type TodoStatus = 'pending' | 'in_progress' | 'completed';

// 将 TodoItem 转换为 Todo
function toTodo(item: TodoItem): Todo {
  return {
    id: item.id,
    content: item.content,
    status: item.status,
    createdAt: new Date(item.createdAt).toISOString(),
    updatedAt: new Date(item.updatedAt).toISOString(),
  };
}

/**
 * Todo 管理器
 * 提供对当前会话 todo 列表的操作接口
 */
class TodoManager {
  private sessionManager: SessionManager | null = null;

  /**
   * 设置会话管理器
   */
  setSessionManager(manager: SessionManager): void {
    this.sessionManager = manager;
  }

  /**
   * 获取当前 todo 列表
   */
  getTodos(): Todo[] {
    if (!this.sessionManager) {
      return [];
    }
    return this.sessionManager.getTodos().map(toTodo);
  }

  /**
   * 更新 todo 列表
   */
  async setTodos(todos: Todo[]): Promise<void> {
    if (!this.sessionManager) {
      return;
    }
    await this.sessionManager.setTodos(todos);
  }

  /**
   * 添加单个 todo
   */
  async addTodo(content: string, status: TodoStatus = 'pending'): Promise<Todo> {
    const todos = this.getTodos();
    const now = new Date().toISOString();
    const newTodo: Todo = {
      id: this.generateId(),
      content,
      status,
      createdAt: now,
      updatedAt: now,
    };
    todos.push(newTodo);
    await this.setTodos(todos);
    return newTodo;
  }

  /**
   * 更新 todo 状态
   */
  async updateTodoStatus(id: string, status: TodoStatus): Promise<boolean> {
    const todos = this.getTodos();
    const todo = todos.find((t) => t.id === id);
    if (!todo) return false;

    todo.status = status;
    todo.updatedAt = new Date().toISOString();
    await this.setTodos(todos);
    return true;
  }

  /**
   * 删除 todo
   */
  async deleteTodo(id: string): Promise<boolean> {
    const todos = this.getTodos();
    const index = todos.findIndex((t) => t.id === id);
    if (index === -1) return false;

    todos.splice(index, 1);
    await this.setTodos(todos);
    return true;
  }

  /**
   * 清空所有 todo
   */
  async clearTodos(): Promise<void> {
    await this.setTodos([]);
  }

  /**
   * 生成唯一 ID
   */
  private generateId(): string {
    return Math.random().toString(36).substring(2, 10);
  }

  /**
   * 检查是否已初始化
   */
  isInitialized(): boolean {
    return this.sessionManager !== null;
  }
}

// 导出单例
export const todoManager = new TodoManager();
