import type { Ref } from 'vue';

/**
 * 文件职责：班次模板动作。
 * 1. 管理模板时间输入与重置。
 * 2. 提交模板保存请求并刷新排班。
 */
import type { ShiftType, StoreShiftTemplatesDto } from '#/api/store-staff';
import type { StaffScheduleSnapshot } from '#/views/store/staff/types';

import { message } from 'ant-design-vue';

import { saveStoreStaffTemplatesApi } from '#/api/store-staff';

import { cloneTemplates, normalizeTime } from './helpers';

interface CreateTemplateActionsOptions {
  isTemplateSaving: Ref<boolean>;
  loadScheduleSettings: () => Promise<void>;
  patchTemplates: (nextTemplates: StoreShiftTemplatesDto) => void;
  scheduleSnapshot: Ref<null | StaffScheduleSnapshot>;
  selectedStoreId: Ref<string>;
  templates: Ref<StoreShiftTemplatesDto>;
}

export function createTemplateActions(options: CreateTemplateActionsOptions) {
  /** 更新单个模板时间字段。 */
  function setTemplateTime(payload: {
    field: 'endTime' | 'startTime';
    shiftType: Exclude<ShiftType, 'off'>;
    value: string;
  }) {
    const currentTemplate = options.templates.value[payload.shiftType];
    options.templates.value = {
      ...options.templates.value,
      [payload.shiftType]: {
        ...currentTemplate,
        [payload.field]: normalizeTime(
          payload.value,
          currentTemplate[payload.field],
        ),
      },
    };
  }

  /** 重置模板到最近快照。 */
  function resetTemplates() {
    if (!options.scheduleSnapshot.value) return;
    options.templates.value = cloneTemplates(
      options.scheduleSnapshot.value.templates,
    );
    message.success('班次模板已重置');
  }

  /** 保存模板。 */
  async function handleSaveTemplates() {
    if (!options.selectedStoreId.value) return;

    options.isTemplateSaving.value = true;
    try {
      const nextTemplates = await saveStoreStaffTemplatesApi({
        storeId: options.selectedStoreId.value,
        templates: cloneTemplates(options.templates.value),
      });

      options.patchTemplates(nextTemplates);
      await options.loadScheduleSettings();
      message.success('班次模板已保存');
    } catch (error) {
      console.error(error);
    } finally {
      options.isTemplateSaving.value = false;
    }
  }

  return {
    handleSaveTemplates,
    resetTemplates,
    setTemplateTime,
  };
}
