import { h, inject, defineComponent, ref, createTextVNode, type VNode } from 'vue';
import { RouterLink } from 'vue-router';
import useAsyncState from "@/useAsyncState.ts";

export default defineComponent({
    name: 'ge-deutsch-article',
    props: {
        articleName: {
            type: String,
            required: true,
        },
    },
    async setup(props) {
        const currentLang = ref<"en" | "de">("de");

        function clickBtn() {
            currentLang.value = currentLang.value === "en" ? "de" : "en";
        }

        const parseDom = inject('dom-parse', (innerHTML: string) => Object.assign(document.createElement('div'), { innerHTML }));

        const { result: articleContent, stateIsReady } = useAsyncState('ge-deutsch-article-data', async ({ hostUrl }) => {
            const articleResponse = await fetch(`${ hostUrl }/generative-energy/static/content/${ props.articleName }.html`);
            return await articleResponse.text();
        });

        function transformArticleNode(node: Node): VNode | string {
            if (node.nodeType === node.ELEMENT_NODE) {
                const el = node as Element;
                const attrs: Record<string, string> = {}; 
                const children = [...node.childNodes].map(_ => transformArticleNode(_));

                if (el.tagName === 'P') {
                    el.classList.add('text-slab');
                    children.unshift(h('button', { class: 'swap', onClick: (e) => { 
                        e.target.parentElement.classList.toggle('swap');
                    } }, '↻'));
                }

                for (let i = 0; i < el.attributes.length; i++) {
                    const item = el.attributes.item(i);
                    if (item) {
                        attrs[item.name] = item.value;
                    }
                }

                return h((node as Element).tagName, attrs, children);
            } else {
                return createTextVNode(node.textContent ?? '');
            }
        }

        function ArticleContentTransformed() {
            if (articleContent.value) {
                const dom = parseDom(articleContent.value);
                return h('div', {}, [...dom.children].map(_ => transformArticleNode(_)));
            }
            return <div>Artikel lädt...</div>;
        }

        await stateIsReady;

        return () => <div class="ge-article">
            <div class="header">
                <RouterLink to={{ name: 'GEDeutsch' }}>Zur Artikelübersicht</RouterLink>
                <button onClick={clickBtn}>
                    Sprache auf <span>{currentLang.value === "en" ? "Deutsch" : "Englisch"}</span> umschalten
                </button>
            </div>
            <article class={`lang-${ currentLang.value }`}>
                <ArticleContentTransformed />
            </article>
        </div>;
    }
});
