import { type InjectionKey, type Ref, inject, provide, ref } from 'vue';

interface WorkbenchWorklogSignal {
  /** 递增版本号：工时类 widget watch 它触发重拉 */
  revision: Ref<number>;
  /** 任一 widget 内联填报/修改工时后调用，广播给同一工作台内的工时类 widget */
  notify: () => void;
}

const WORKBENCH_WORKLOG_SIGNAL: InjectionKey<WorkbenchWorklogSignal> = Symbol('workbench-worklog-signal');

/**
 * 工作台内联填报工时的跨 widget 刷新信号。
 *
 * todo 面板等 widget 可在工作台路由内弹层填报工时，不触发工作台 keepAlive 的 onActivated，
 * 「我的工时」widget 因此停在旧数据。用 provide/inject 在工作台根广播一个版本号，
 * 填报方 notify、展示方 watch revision 重拉，作用域限定在工作台子树、不进全局 store。
 */
export function provideWorkbenchWorklogSignal(): WorkbenchWorklogSignal {
  const revision = ref(0);
  const signal: WorkbenchWorklogSignal = {
    revision,
    notify: () => {
      revision.value += 1;
    }
  };
  provide(WORKBENCH_WORKLOG_SIGNAL, signal);
  return signal;
}

/** widget 内消费：notify 上报变更、revision 供 watch 重拉；脱离工作台根时退化为无操作 */
export function useWorkbenchWorklogSignal(): WorkbenchWorklogSignal {
  return inject(WORKBENCH_WORKLOG_SIGNAL, { revision: ref(0), notify: () => {} });
}
