package com.fujica.abk.utils;

import com.amap.adapter.view.ViewGroup;
import com.fujica.abk.ResourceTable;
import ohos.agp.components.Component;
import ohos.agp.components.ComponentContainer;
import ohos.agp.components.LayoutScatter;
import ohos.agp.components.ProgressBar;
import ohos.agp.components.Text;
import ohos.agp.colors.RgbColor;
import ohos.agp.components.element.ShapeElement;
import ohos.agp.utils.Color;
import ohos.agp.window.dialog.CommonDialog;
import ohos.app.Context;
import ohos.eventhandler.EventHandler;
import ohos.eventhandler.EventRunner;

/**
 * Loading对话框类，继承CommonDialog
 * 全屏遮罩，中间显示loading，不可点击，不可取消
 */
class LoadingCommonDialog extends CommonDialog {
    private Component rootLayout;

    public LoadingCommonDialog(Context context) {
        super(context);
        setTransparentBackground();
        initDialog(context);
    }

    private void initDialog(Context context) {
        // 使用布局文件加载
        rootLayout = LayoutScatter.getInstance(context)
                .parse(ResourceTable.Layout_layout_loading_dialog, null, false);

        // 获取布局中的组件并设置属性
        ProgressBar progressBar = (ProgressBar) rootLayout.findComponentById(ResourceTable.Id_progress_bar);
        if (progressBar != null) {
            progressBar.setProgressColor(Color.BLUE);
        }

        Text text = (Text) rootLayout.findComponentById(ResourceTable.Id_text_loading);
        if (text != null) {
            // 文本已在布局文件中设置，这里可以保持默认或根据需要修改
        }

        // 设置对话框属性
        setTransparent(true); // 设置对话框背景透明
        setContentCustomComponent(rootLayout);
        setAutoClosable(false); // 不可自动关闭
    }

    @Override
    public void show() {
        super.show();
        // 在显示后设置窗口和根布局的透明背景
    }

    /**
     * 设置窗口和根布局的透明背景
     */
    private void setTransparentBackground() {
        // 设置窗口背景为透明
        RgbColor transparentColor = new RgbColor(Color.TRANSPARENT.getValue());
        getWindow().setBackgroundColor(transparentColor);
        getWindow().setLayoutInDisplaySideMode(1);
        getWindow().setWindowLayout(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
    }
}

/**
 * Loading对话框工具类
 * 全屏遮罩，中间显示loading，不可点击，不可取消
 */
public class LoadingDialog {
    private static LoadingCommonDialog currentDialog = null;
    private static int showCount = 0; // 显示计数，用于处理多个请求同时显示loading的情况

    /**
     * 在主线程显示Loading
     */
    private static void showOnMainThread(Context context) {
        if (context == null) {
            return;
        }

        // 获取主线程的 EventRunner
        EventRunner mainRunner = EventRunner.getMainEventRunner();
        if (mainRunner == null) {
            // 如果获取不到主线程，直接在当前线程显示（可能已经是主线程）
            showDialog(context);
            return;
        }

        // 创建主线程的 EventHandler
        EventHandler mainHandler = new EventHandler(mainRunner);
        mainHandler.postTask(() -> {
            showDialog(context);
        });
    }

    /**
     * 在主线程隐藏Loading
     */
    private static void hideOnMainThread() {
        // 获取主线程的 EventRunner
        EventRunner mainRunner = EventRunner.getMainEventRunner();
        if (mainRunner == null) {
            // 如果获取不到主线程，直接在当前线程隐藏（可能已经是主线程）
            hideDialog();
            return;
        }

        // 创建主线程的 EventHandler
        EventHandler mainHandler = new EventHandler(mainRunner);
        mainHandler.postTask(() -> {
            hideDialog();
        });
    }

    /**
     * 显示Loading对话框
     */
    private static void showDialog(Context context) {
        if (currentDialog != null && currentDialog.isShowing()) {
            // 如果已经显示，增加计数
            showCount++;
            return;
        }

        try {
            // 创建自定义的Loading对话框
            LoadingCommonDialog dialog = new LoadingCommonDialog(context);

            // 显示对话框
            dialog.show();
            currentDialog = dialog;
            showCount = 1;

        } catch (Exception e) {
            Log.error("显示Loading失败: " + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 隐藏Loading对话框
     */
    private static void hideDialog() {
        if (currentDialog == null) {
            return;
        }

        try {
            // 减少计数
            showCount--;

            // 只有当计数为0时才真正关闭对话框
            if (showCount <= 0) {
                if (currentDialog.isShowing()) {
                    currentDialog.destroy();
                }
                currentDialog = null;
                showCount = 0;
            }
        } catch (Exception e) {
            Log.error("隐藏Loading失败: " + e.getMessage());
            e.printStackTrace();
            // 出错时强制重置
            currentDialog = null;
            showCount = 0;
        }
    }

    /**
     * 显示Loading
     */
    public static void show(Context context) {
        showOnMainThread(context);
    }

    /**
     * 隐藏Loading
     */
    public static void hide() {
        hideOnMainThread();
    }

    /**
     * 强制关闭所有Loading（用于异常情况）
     */
    public static void forceHide() {
        if (currentDialog != null) {
            try {
                if (currentDialog.isShowing()) {
                    currentDialog.destroy();
                }
            } catch (Exception e) {
                Log.error("强制关闭Loading失败: " + e.getMessage());
            }
            currentDialog = null;
            showCount = 0;
        }
    }
}

