import { IItem, MItem } from "../../../../utils/types/item";
import { genMeta } from "../../../view/logic/meta/meta";
import { PG, active } from "../ed-global";
import { pushTreeNode } from "./build/push-tree";

export const treeRebuild = async (p: PG, arg?: { note?: string }) => {
  const is_layout =
    p.site.layout &&
    p.site.layout.id === p.page.cur.id &&
    arg?.note === "load-layout page-init";

  for (const [k, v] of Object.entries(p.comp.list)) {
    if (!p.comp.loaded[k]) {
      const mcomp = v.doc.getMap("map").get("root");
      const icomp = mcomp?.toJSON() as IItem | undefined;
      if (icomp) {
        p.comp.loaded[k] = {
          comp: icomp,
          mcomp,
        };
      }
    }
  }

  const mroot = p.page.doc?.getMap("map").get("root");
  const mitems: MItem[] = [];
  mroot?.get("childs")?.forEach((m) => mitems.push(m));

  const meta = {};
  p.page.tree = [];
  for (const mitem of mitems) {
    const item = mitem.toJSON() as IItem;
    if (item) {
      p.page;
      genMeta(
        {
          comps: p.comp.loaded,
          meta,
          smeta: p.page.smeta,
          on: {
            async visit(meta) {
              if (!is_layout) {
                pushTreeNode(p, meta);

                // if (meta.item.component?.props) {
                //   viEvalProps({ meta: p.page.meta, tick: 0 }, meta);
                // }

                // if (meta.item.adv?.jsBuilt) {
                //   viEvalScript({ meta: p.page.meta, tick: 0 }, meta);
                // }
              }
            },
          },
        },
        { item }
      );
    }
  }

  if (is_layout) {
    p.site.layout.meta = meta;
  } else {
    let root_id = "root";
    if (p.site.layout && p.site.layout.meta) {
      for (const [_, v] of Object.entries(p.site.layout.meta)) {
        if (v.item.component?.id) {
          if (v.item.name === "content") {
            root_id = v.item.id;
            break;
          }
        }
      }

      p.page.root_id = root_id;

      if (p.site.layout && p.site.layout.id === p.page.cur.id) {
        p.page.meta = meta;
      } else {
        p.page.meta = { ...p.site.layout.meta, ...meta };
      }
    }
  }
};

export const getMRoot = (p: PG) => {
  const root = p.page.doc?.getMap("map").get("root");
  if (root) {
    return p.page.root_id === "root"
      ? root
      : p.page.meta[p.page.root_id].mitem?.get("childs")?.get(0);
  }
};

export const getMetaById = (p: PG, id: string) => {
  if (active.comp_id) {
    if (p.comp.list[active.comp_id])
      return p.comp.list[active.comp_id].meta[id];
  } else {
    return p.page.meta[id];
  }
};
