import { useCourseData } from "@/composables";
import { useUserStore } from "@/stores/user";
import type { CircleLight, CourseSessionUser, ExpertSessionUser } from "@/types";
import log from "loglevel";
import { defineStore } from "pinia";

type CircleCockpit = CircleLight & {
  name: string;
};

export type CockpitStoreState = {
  courseSessionMembers: CourseSessionUser[] | undefined;
  circles: CircleCockpit[] | undefined;
  currentCircle: CircleCockpit | undefined;
};

export const useCockpitStore = defineStore({
  id: "cockpit",
  state: () => {
    return {
      courseSessionMembers: undefined,
      circles: [],
      currentCircle: undefined,
    } as CockpitStoreState;
  },
  actions: {
    async loadCircles(
      courseSlug: string,
      currentCourseSessionUser: CourseSessionUser | undefined
    ) {
      log.debug("loadCircles called", courseSlug);

      this.circles = await courseCircles(courseSlug, currentCourseSessionUser);

      if (this.circles?.length) {
        await this.setCurrentCourseCircle(this.circles[0].slug);
      }
    },
    async setCurrentCourseCircle(circleSlug: string) {
      this.currentCircle = this.circles?.find((c) => c.slug === circleSlug);
    },
    async setCurrentCourseCircleFromEvent(event: CircleLight) {
      await this.setCurrentCourseCircle(event.slug);
    },
  },
});

async function courseCircles(
  courseSlug: string,
  currentCourseSessionUser: CourseSessionUser | undefined
) {
  if (currentCourseSessionUser && currentCourseSessionUser.role === "EXPERT") {
    const expert = currentCourseSessionUser as ExpertSessionUser;
    return expert.circles.map((c) => {
      return { ...c, name: c.title };
    });
  }

  const userStore = useUserStore();
  // Return all circles from learning path for admin users
  if (userStore.is_superuser) {
    const lpQueryResult = useCourseData(courseSlug);
    await lpQueryResult.resultPromise;

    return (lpQueryResult.circles.value ?? []).map((c) => {
      return {
        id: c.id,
        slug: c.slug,
        title: c.title,
        name: c.title,
      } as const;
    });
  }

  return [];
}
