import { computed } from 'vue';
import { useAuthStore } from '@/store/modules/auth';
import { useObjectContextStore } from '@/store/modules/object-context';

/**
 * 任务 / 执行按钮可见度集中判定
 *
 * 关键领域规则：
 * - 任务负责人本人不能编辑 / 删除自己负责的任务（增删改归上级 / 项目负责人裁决）
 * - 本人能做的：状态推进（含 cancel "退出"任务）、加协办人、在自己任务下新增子任务
 * - 执行负责人对子任务无编辑 / 删除权（子任务归父任务 owner 管）
 * - 执行负责人能维护一级任务协办人（一级任务 `executionOwnerId` 通道；子任务不开此通道）
 * - 父任务负责人能改 / 删子任务，但不能给子任务加协办人 / 建孙任务 / 推进状态
 *
 * 权限码来源：`project:*` / `project:execution:*` / `project:task:*` 是**对象域权限码**，
 * 挂在项目对象上下文里（项目负责人 / 项目协作者等角色），从 objectContextStore.buttonCodes 取，
 * **不在** authStore.userInfo.buttons（那是全局站点级权限）。
 */
export function useTaskPermissions() {
  const authStore = useAuthStore();
  const objectContextStore = useObjectContextStore();

  const currentUserId = computed(() => authStore.userInfo.userId || '');
  const buttonCodeSet = computed(() => new Set(objectContextStore.buttonCodes));

  function hasPermission(code: string): boolean {
    return buttonCodeSet.value.has(code);
  }

  /**
   * 判定对象是否处于可编辑/可操作状态。
   *
   * 按按钮可见度矩阵（spec §4.2 / §4.3 注释 `allowEdit === true 即 pending / active 状态`）：
   * 可编辑状态严格 = `pending` OR `active`，**不含 paused / completed / cancelled**。
   *
   * 不用 `record.allowEdit === true`：列表 VO 后端不一定下发该字段，
   * 经 `normalizeProjectExecution` 的 `Boolean(undefined) === false` 会让列表所有行误判为不可编辑。
   * 直接读 `statusCode` 字段（列表 / 详情 VO 都必下发，状态机核心字段）。
   */
  function isMutable(record: { statusCode: string }): boolean {
    return record.statusCode === 'pending' || record.statusCode === 'active';
  }

  // —— 执行侧 ——

  function canEditExecution(execution: Api.Project.ProjectExecution): boolean {
    return (
      isMutable(execution) && (hasPermission('project:execution:update') || currentUserId.value === execution.ownerId)
    );
  }

  function canDeleteExecution(execution: Api.Project.ProjectExecution): boolean {
    // completed 终态后端硬卡（不允许主动删，级联删除时由后端兜底），前端按钮也拦掉
    if (execution.statusCode === 'completed') return false;
    return hasPermission('project:execution:delete');
  }

  function canChangeExecutionOwner(execution: Api.Project.ProjectExecution): boolean {
    return isMutable(execution) && hasPermission('project:execution:owner');
  }

  function canManageExecutionAssignee(execution: Api.Project.ProjectExecution): boolean {
    return (
      isMutable(execution) && (hasPermission('project:execution:assignee') || currentUserId.value === execution.ownerId)
    );
  }

  /**
   * 协办人入口按钮（列表面板）是否显示。
   *
   * 仅"项目负责人 / 项目创建人 / 执行负责人"可见，普通登录用户隐藏（去"查看"对话框里看团队）。
   * 不含状态前置——任何状态下身份匹配都给入口；dialog 内的"加 / 移 / 换 owner"写按钮自己再判 isMutable。
   */
  function canSeeExecutionAssigneeEntry(execution: Api.Project.ProjectExecution): boolean {
    return (
      hasPermission('project:execution:assignee') ||
      hasPermission('project:execution:owner') ||
      currentUserId.value === execution.ownerId
    );
  }

  // —— 任务侧（按一级 / 子任务指派） ——

  function isTopLevelTask(task: Api.Project.ProjectTask): boolean {
    return task.parentTaskId === null || task.parentTaskId === undefined;
  }

  function canEditTask(task: Api.Project.ProjectTask): boolean {
    if (!isMutable(task)) return false;
    if (hasPermission('project:task:update')) return true;
    return isTopLevelTask(task)
      ? currentUserId.value === task.executionOwnerId
      : currentUserId.value === task.parentTaskOwnerId;
  }

  function canDeleteTask(task: Api.Project.ProjectTask): boolean {
    // completed 终态后端硬卡（不允许主动删，级联删除时由后端兜底），前端按钮也拦掉
    if (task.statusCode === 'completed') return false;
    if (hasPermission('project:task:delete')) return true;
    return isTopLevelTask(task)
      ? currentUserId.value === task.executionOwnerId
      : currentUserId.value === task.parentTaskOwnerId;
  }

  function canCreateTopLevelTask(execution: Api.Project.ProjectExecution): boolean {
    return isMutable(execution) && (hasPermission('project:task:create') || currentUserId.value === execution.ownerId);
  }

  function canCreateSubTask(task: Api.Project.ProjectTask): boolean {
    return isMutable(task) && (hasPermission('project:task:create') || currentUserId.value === task.ownerId);
  }

  function canManageTaskAssignee(task: Api.Project.ProjectTask): boolean {
    if (!isMutable(task)) return false;
    if (hasPermission('project:task:assignee')) return true;
    if (currentUserId.value === task.ownerId) return true;
    // 一级任务：执行负责人也可维护协办人；子任务：父任务负责人不在此放行（§4.2）
    return isTopLevelTask(task) && currentUserId.value === task.executionOwnerId;
  }

  function canReportTaskWorklog(): boolean {
    return hasPermission('project:task:worklog');
  }

  return {
    // execution
    canEditExecution,
    canDeleteExecution,
    canChangeExecutionOwner,
    canManageExecutionAssignee,
    canSeeExecutionAssigneeEntry,
    // task
    canEditTask,
    canDeleteTask,
    canCreateTopLevelTask,
    canCreateSubTask,
    canManageTaskAssignee,
    canReportTaskWorklog
  };
}
