import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
import { getConfigValue } from "@ijl/cli";

import { keycloak } from "../kc";
import { AccessCode, BaseResponse, Course, Lesson, User, UserData } from "../model";

export const api = createApi({
  reducerPath: "auth",
  baseQuery: fetchBaseQuery({
    baseUrl: getConfigValue("journal.back.url"),
    fetchFn: async (input: RequestInfo | URL, init?: RequestInit | undefined) => {
      const response = await fetch(input, init);

      if (response.status === 403) keycloak.login()

      return response;
    },
    headers: {
      "Content-Type": "application/json;charset=utf-8",
    },
    prepareHeaders: (headers) => {
      headers.set('Authorization', `Bearer ${keycloak.token}`)
    }
  }),
  tagTypes: ['LessonList', 'CourseList'],
  endpoints: (builder) => ({
    coursesList: builder.query<BaseResponse<Course[]>, void>({
      query: () => '/course/list',
      providesTags: ['CourseList']
    }),
    createUpdateCourse: builder.mutation<BaseResponse<Course>, Partial<Course> & Pick<Course, 'name'>>({
      query: (course) => ({
        url: '/course',
        method: 'POST',
        body: course,
      }),
      invalidatesTags: ['CourseList']
    }),
    courseAllStudents: builder.query<BaseResponse<User[]>, string>({
      query: (courseId) => `/course/students/${courseId}`
    }),
    manualAddStudent: builder.mutation<BaseResponse<void>, { lessonId: string, user: User }>({
      query: ({lessonId, user}) => ({
        url: `/lesson/add-student/${lessonId}`,
        method: 'POST',
        body: user
      })
    }),

    lessonList: builder.query<BaseResponse<Lesson[]>, string>({
      query: (courseId) => `/lesson/list/${courseId}`,
      providesTags: ['LessonList']
    }),
    createLesson: builder.mutation<BaseResponse<Lesson>, Pick<Lesson, 'name' | 'date'> & { courseId: string }>({
      query: ({ name, courseId, date }) => ({
        url: '/lesson',
        method: 'POST',
        body: { name, courseId, date },
      }),
      invalidatesTags: ['LessonList']
    }),
    lessonById: builder.query<BaseResponse<Lesson>, string>({
      query: (lessonId: string) => `/lesson/${lessonId}`
    }),

    createAccessCode: builder.query<BaseResponse<AccessCode>, { lessonId: string }>({
      query: ({ lessonId }) => ({
        url: '/lesson/access-code',
        method: 'POST',
        body: { lessonId },
      })
    }),
    getAccess: builder.query<BaseResponse<{ user: UserData, accessCode: AccessCode }>, { accessCode: string }>({
      query: ({ accessCode }) => ({
        url: `/lesson/access-code/${accessCode}`,
        method: 'GET',
      })
    })
  }),
});