/**
 * 门店抽屉与删除动作：
 * - 打开抽屉（新增/编辑）
 * - 提交保存
 * - 删除门店
 */
import type { Ref } from 'vue';

import type { DrawerMode, StoreFormState } from '../../types';

import type { StoreBusinessStatus, StoreListItemDto } from '#/api/store';

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

import {
  createStoreApi,
  deleteStoreApi,
  retryStoreGeocodeApi,
  StoreBusinessStatus as StoreBusinessStatusEnum,
  toggleStoreBusinessStatusApi,
  updateStoreApi,
} from '#/api/store';

import { applyRecordToForm, resetStoreForm, toSavePayload } from './helpers';

interface CreateDrawerActionsOptions {
  drawerMode: Ref<DrawerMode>;
  formState: StoreFormState;
  isDrawerVisible: Ref<boolean>;
  isSubmitting: Ref<boolean>;
  loadList: () => Promise<void>;
  loadStats: () => Promise<void>;
}

export function createDrawerActions(options: CreateDrawerActionsOptions) {
  /** 打开抽屉并准备对应模式的数据。 */
  function openDrawer(mode: DrawerMode, record?: StoreListItemDto) {
    // 1. 记录当前抽屉模式。
    options.drawerMode.value = mode;

    // 2. 根据模式回填或重置表单。
    if (mode === 'edit' && record) {
      applyRecordToForm(options.formState, record);
    } else {
      resetStoreForm(options.formState);
    }

    // 3. 打开抽屉。
    options.isDrawerVisible.value = true;
  }

  /** 提交新增/编辑门店。 */
  async function handleSubmit() {
    // 1. 开启提交加载态。
    options.isSubmitting.value = true;
    try {
      // 2. 根据模式调用对应保存接口。
      const payload = toSavePayload(options.formState);
      if (options.drawerMode.value === 'edit') {
        await updateStoreApi(payload);
        message.success('更新成功');
      } else {
        await createStoreApi(payload);
        message.success('创建成功');
      }

      // 3. 关闭抽屉并刷新页面数据。
      options.isDrawerVisible.value = false;
      await Promise.all([options.loadList(), options.loadStats()]);
    } catch (error) {
      console.error(error);
    } finally {
      options.isSubmitting.value = false;
    }
  }

  /** 删除门店并刷新数据。 */
  async function handleDelete(record: StoreListItemDto) {
    try {
      // 1. 调用删除接口。
      await deleteStoreApi(record.id);
      message.success('删除成功');

      // 2. 同步刷新列表与统计。
      await Promise.all([options.loadList(), options.loadStats()]);
    } catch (error) {
      console.error(error);
    }
  }

  /** 快速切换门店营业状态。 */
  async function handleToggleBusinessStatus(record: StoreListItemDto) {
    try {
      const nextStatus: StoreBusinessStatus =
        record.businessStatus === StoreBusinessStatusEnum.Operating
          ? StoreBusinessStatusEnum.Resting
          : StoreBusinessStatusEnum.Operating;

      await toggleStoreBusinessStatusApi({
        storeId: record.id,
        businessStatus: nextStatus,
        ...(nextStatus === StoreBusinessStatusEnum.Resting
          ? {
              closureReason: 99,
              closureReasonText: '门店手动切换为休息中',
            }
          : {}),
      });

      message.success(
        nextStatus === StoreBusinessStatusEnum.Operating
          ? '已恢复营业'
          : '已切换为休息中',
      );
      await Promise.all([options.loadList(), options.loadStats()]);
    } catch (error) {
      console.error(error);
    }
  }

  /** 手动重试门店定位。 */
  async function handleRetryGeocode(record: StoreListItemDto) {
    try {
      await retryStoreGeocodeApi(record.id);
      message.success('已触发定位重试');
      await options.loadList();
    } catch (error) {
      console.error(error);
    }
  }

  return {
    handleDelete,
    handleRetryGeocode,
    handleSubmit,
    handleToggleBusinessStatus,
    openDrawer,
  };
}
