import type {ButtonGroupColors, ButtonConfig} from '../components/button-group/index.type';
import {Toolbar} from '../components/button-group/toolbar';
import {BimComponent} from '../core/component';
import type {BimEngine} from '../bim-engine';
import {BimButtonGroup} from "../components/button-group";
import {BimTree} from "../components/tree";
import {TreeNodeConfig} from "../components/tree/types.ts";
import {BimDialog} from "../components/dialog";
import {BimTab} from "../components/tab";

const MOCK_STRUCT_DATA: TreeNodeConfig[] =[
    {
        id: 'root',
        label: '全部构件',
        expanded: true,
        clickAction: 'expand',
        children: [
            {
                id: 'level-1',
                label: '一层',
                expanded: false,
                icon:'<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><path fill="currentColor" d="M20.73 16.52V7.59a.7.7 0 0 0-.08-.33a.74.74 0 0 0-.36-.36l-8-3.58a.75.75 0 0 0-.62 0l-8 3.58a.8.8 0 0 0-.44.69v8.82a.83.83 0 0 0 .44.69l8 3.58a.72.72 0 0 0 .62 0l8-3.58a.77.77 0 0 0 .44-.58m-16-7.78l6.5 2.92v7.18l-6.5-2.91Zm8 2.92l6.5-2.92v7.19l-6.5 2.91ZM12 4.82l6.17 2.77L12 10.35L5.83 7.59Z"/></svg>',
                clickAction: 'expand',
                children: [
                    { id: 'l1-wall', label: '墙体（128）'},
                    { id: 'l1-column', label: '柱（46）' },
                    { id: 'l1-beam', label: '梁（82）' },
                    { id: 'l1-slab', label: '楼板（12）' },
                    { id: 'l1-door', label: '门（24）' },
                    { id: 'l1-window', label: '窗（36）' }
                ]
            },
            {
                id: 'level-2',
                label: '二层',
                expanded: false,
                clickAction: 'expand',
                children: [
                    { id: 'l2-wall', label: '墙体（141）' },
                    { id: 'l2-column', label: '柱（52）' },
                    { id: 'l2-beam', label: '梁（90）' },
                    { id: 'l2-slab', label: '楼板（12）' },
                    { id: 'l2-door', label: '门（18）' },
                    { id: 'l2-window', label: '窗（40）' }
                ]
            },
            {
                id: 'level-3',
                label: '三层',
                expanded: false,
                clickAction: 'expand',
                children: [
                    { id: 'l3-wall', label: '墙体（136）' },
                    { id: 'l3-column', label: '柱（48）' },
                    { id: 'l3-beam', label: '梁（88）' },
                    { id: 'l3-slab', label: '楼板（12）' },
                    { id: 'l3-door', label: '门（16）' },
                    { id: 'l3-window', label: '窗（38）' }
                ]
            },
            {
                id: 'level-roof',
                label: '屋面层',
                expanded: false,
                clickAction: 'expand',
                children: [
                    { id: 'rf-slab', label: '屋面板（6）' },
                    { id: 'rf-beam', label: '屋面梁（24）' },
                    { id: 'rf-parapet', label: '女儿墙（18）' }
                ]
            }
        ]
    }
];

/**
 * 底部工具栏管理器 (ToolbarManager)
 * 仅负责管理底部工具栏实例。
 */
export class ConstructTreeManagerBtn extends BimComponent {
    private toolbar: Toolbar | null = null;
    private toolbarContainer: HTMLElement | null = null;
    private container: HTMLElement;
    private dialog: BimDialog | null = null;

    constructor(engine: BimEngine, container: HTMLElement) {
        super(engine);
        this.container = container;
        this.init();
    }

    private init() {
        // 创建底部工具栏专用容器
        this.toolbarContainer = document.createElement('div');
        this.toolbarContainer.id = 'bim-construct-tree';
        this.container.appendChild(this.toolbarContainer);
        this.toolbar = new BimButtonGroup({
            container: this.toolbarContainer,
            showLabel: false,
            direction: 'column',
            position: 'top-left', // 底部居中
            align: 'vertical',         // 图标在上
            expand: 'up'               // 向上展开
        });
        this.toolbar.init();
        this.toolbar.setEngine(this.engine);
        this.toolbar.addGroup('construct-tree');
        this.toolbar.addButton({
            id: 'construct-tree-btn',
            groupId: 'construct-tree',
            type: 'button',
            label: 'construct-tree',
            icon: '<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><path fill="currentColor" d="M15 21v-3h-4V8H9v3H2V3h7v3h6V3h7v8h-7V8h-2v8h2v-3h7v8zM4 5v4zm13 10v4zm0-10v4zm0 4h3V5h-3zm0 10h3v-4h-3zM4 9h3V5H4z"/></svg>',
            onClick: () => {
                this.openConstructTreeDialog()
            }
        });
        this.toolbar.render();
    }

    public openConstructTreeDialog() {
        this.setVisible(false);

        // 构件树实例（放在“构件”标签内）
        const tree = new BimTree({
            data: MOCK_STRUCT_DATA,
            checkable: true,
            indent: 0,
            enableSearch: true,
            checkStrictly: true,
            defaultExpandAll: true,
            renderActions: (_node) => {
                return '<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="1.5" d="m14.828 6.343l2.829 2.829m1.414-1.415L8.464 18.364l-3.535.707l.707-3.536L16.243 4.93a2 2 0 0 1 2.828 2.828Z"/></svg>';
            },
            onNodeCheck: (node) => {
                console.log('onNodeCheck', node);
            },
            onNodeSelect: (node) => {
                console.log('onNodeSelect', node);
            },
            onNodeExpand: (node) => {
                console.log('onNodeExpand', node);
                this.dialog?.fitWidth();
            },
        });
        tree.init();

        // 系统/空间暂留空占位，可后续填充业务内容
        const systemPlaceholder = document.createElement('div');
        systemPlaceholder.className = 'construct-tab__panel-content';
        const spacePlaceholder = document.createElement('div');
        spacePlaceholder.className = 'construct-tab__panel-content';

        // 构件面板容器，确保内部树区域可滚动
        const componentPanel = document.createElement('div');
        componentPanel.className = 'construct-tab__panel-content';
        componentPanel.appendChild(tree.element);

        // 创建 Tab 容器（仅在本弹窗内使用，不额外挂 Manager）
        const tabMount = document.createElement('div');
        tabMount.className = 'construct-tab__container';
        tabMount.style.height = '100%';
        tabMount.style.overflow = 'hidden';
        const tab = new BimTab({
            container: tabMount,
            tabs: [
                {id: 'component', title: 'tab.component', content: componentPanel},
                {id: 'system', title: 'tab.system', content: systemPlaceholder},
                {id: 'space', title: 'tab.space', content: spacePlaceholder},
            ],
            activeId: 'component',
            onChange: () => {
                // 切换后根据内容宽度刷新弹窗
                this.dialog?.fitWidth();
            }
        });
        tab.init();

        this.dialog = this.engine.dialog!.create({
            title: 'constructTree.title',
            minWidth: 320,
            height: 420,
            content: tabMount,
            position: {x: 20, y: 20},
            resizable: false,
            onClose: () => {
                tab.destroy();
                tree.destroy();
                this.setVisible(true);
            }
        });
        this.dialog?.fitWidth();
    }

    public refresh() {
        this.toolbar?.render();
    }

    public destroy() {
        this.toolbar?.destroy();
        this.toolbar = null;
    }

    // --- 转发 API ---
    public addGroup(groupId: string, beforeGroupId?: string) {
        this.toolbar?.addGroup(groupId, beforeGroupId);
        this.toolbar?.render();
    }

    public addButton(config: ButtonConfig) {
        this.toolbar?.addButton(config);
        this.toolbar?.render();
    }

    public setButtonVisibility(id: string, v: boolean) {
        this.toolbar?.updateButtonVisibility(id, v);
    }

    public setShowLabel(show: boolean) {
        this.toolbar?.setShowLabel(show);
    }

    public setVisible(visible: boolean) {
        if (this.toolbarContainer) {
            this.toolbarContainer.style.visibility = visible ? 'visible' : 'hidden';
        }
    }

    public setBackgroundColor(color: string) {
        this.toolbar?.setBackgroundColor(color);
    }

    public setColors(colors: ButtonGroupColors) {
        this.toolbar?.setColors(colors);
    }
}
