package com.fujica.abk.utils;

import ohos.agp.window.dialog.IDialog;
import ohos.app.Context;
import ohos.eventhandler.EventHandler;
import ohos.eventhandler.EventRunner;

/**
 * 对话框工具类
 * 用于统一管理 ListDialog 的创建和样式配置
 * 统一设置样式，使对话框内容左右居中显示
 */
public class DialogUtil {

    /**
     * 单选监听器接口
     */
    @FunctionalInterface
    public interface SingleSelectListener {
        /**
         * 当选择某个选项时调用
         *
         * @param dialog 对话框对象
         * @param index  选中的索引
         */
        void onSelect(IDialog dialog, int index);
    }

    /**
     * 创建并配置自定义 ListDialog（公共方法）
     * 使用 XML 布局，美化显示，固定宽度 280vp
     *
     * @param context  上下文
     * @param options  选项数组
     * @param listener 选择监听器
     * @return 配置好的 CustomListDialog
     */
    public static CustomListDialog createListDialog(Context context, String[] options,
                                                    SingleSelectListener listener) {
        CustomListDialog customListDialog = new CustomListDialog(context);
        customListDialog.setItems(options);
        customListDialog.setOnItemClickListener((dialog, index) -> {
            if (listener != null) {
                // 转换 CustomListDialog 为 IDialog 的适配
                listener.onSelect(new IDialog() {
                    @Override
                    public void show() {
                        dialog.show();
                    }

                    @Override
                    public void hide() {
                        dialog.dismiss();
                    }

                    @Override
                    public void destroy() {
                        dialog.destroy();
                    }

                    @Override
                    public void remove() {
                        dialog.dismiss();
                    }

                }, index);
            }
        });

        return customListDialog;
    }

    /**
     * 显示确认对话框
     *
     * @param context   上下文
     * @param message   提示信息
     * @param onConfirm 确定按钮回调
     */
    public static void confirm(Context context, String message, Runnable onConfirm) {
        confirm(context, message, onConfirm, null);
    }

    /**
     * 显示确认对话框
     *
     * @param context   上下文
     * @param message   提示信息
     * @param onConfirm 确定按钮回调
     * @param onCancel  取消按钮回调
     */
    public static void confirm(Context context, String message, Runnable onConfirm, Runnable onCancel) {
        if (context == null) {
            return;
        }

        // 创建主线程的 EventHandler，在主线程显示对话框
        DialogUtil.postTask(() -> {
            showConfirmDialog(context, message, onConfirm, onCancel);
        });
    }

    /**
     * 显示确认对话框的实际实现
     */
    private static void showConfirmDialog(Context context, String message, Runnable onConfirm, Runnable onCancel) {
        ConfirmDialog confirmDialog = new ConfirmDialog(context);
        confirmDialog.setMessage(message)
                .setConfirmListener(dialog -> {
                    if (onConfirm != null) {
                        onConfirm.run();
                    }
                    dialog.dismiss();
                })
                .setCancelListener(dialog -> {
                    if (onCancel != null) {
                        onCancel.run();
                    }
                    dialog.dismiss();
                })
                .show();
    }

    public static void postTask(Runnable task) {
        EventRunner mainRunner = EventRunner.getMainEventRunner();
        if (mainRunner != null) {
            EventHandler mainHandler = new EventHandler(mainRunner);
            mainHandler.postTask(task);
        }
    }

    public static void postTask(Runnable task, long delayTime) throws IllegalArgumentException {
        EventRunner mainRunner = EventRunner.getMainEventRunner();
        if (mainRunner != null) {
            EventHandler mainHandler = new EventHandler(mainRunner);
            mainHandler.postTask(task, delayTime);
        }
    }
}

