import SuperJSON from "superjson";

import { eq } from "@homarr/db";
import { serverSettings } from "@homarr/db/schema/sqlite";
import { logger } from "@homarr/log";
import type { defaultServerSettings, ServerSettings } from "@homarr/server-settings";
import { defaultServerSettingsKeys } from "@homarr/server-settings";
import { z } from "@homarr/validation";

import { createTRPCRouter, protectedProcedure, publicProcedure } from "../trpc";

export const serverSettingsRouter = createTRPCRouter({
  // this must be public so anonymous users also get analytics
  getAnalytics: publicProcedure.query(async ({ ctx }) => {
    const setting = await ctx.db.query.serverSettings.findFirst({
      where: eq(serverSettings.settingKey, "analytics"),
    });

    if (!setting) {
      logger.info(
        "Server settings for analytics is currently undefined. Using default values instead. If this persists, there may be an issue with the server settings",
      );
      return {
        enableGeneral: true,
        enableIntegrationData: false,
        enableUserData: false,
        enableWidgetData: false,
      } as (typeof defaultServerSettings)["analytics"];
    }

    return SuperJSON.parse<(typeof defaultServerSettings)["analytics"]>(setting.value);
  }),
  getAll: protectedProcedure.query(async ({ ctx }) => {
    const settings = await ctx.db.query.serverSettings.findMany();

    const data = {} as ServerSettings;
    defaultServerSettingsKeys.forEach((key) => {
      const settingValue = settings.find((setting) => setting.settingKey === key)?.value;
      if (!settingValue) {
        return;
      }
      data[key] = SuperJSON.parse(settingValue);
    });
    return data;
  }),
  saveSettings: protectedProcedure
    .input(
      z.object({
        settingsKey: z.enum(defaultServerSettingsKeys),
        value: z.record(z.string(), z.unknown()),
      }),
    )
    .mutation(async ({ ctx, input }) => {
      const databaseRunResult = await ctx.db
        .update(serverSettings)
        .set({
          value: SuperJSON.stringify(input.value),
        })
        .where(eq(serverSettings.settingKey, input.settingsKey));
      return databaseRunResult.changes === 1;
    }),
});
