import { GraphQLError } from "graphql";
import { builder } from "../builder";
import { CurrentUserType, UserType } from "../types/index";
import { users } from "../../db/schema/index";
import { eq } from "drizzle-orm";

builder.queryField("me", (t) =>
  t.field({
    type: CurrentUserType,
    nullable: true,
    resolve: async (_root, _args, ctx) => {
      if (!ctx.currentUser) return null;
      const user = await ctx.db
        .select()
        .from(users)
        .where(eq(users.id, ctx.currentUser.id))
        .limit(1);
      return user[0] || null;
    },
  }),
);

builder.queryField("userProfile", (t) =>
  t.field({
    type: UserType,
    nullable: true,
    args: {
      id: t.arg.string({ required: true }),
    },
    resolve: async (_root, args, ctx) => {
      const user = await ctx.db
        .select()
        .from(users)
        .where(eq(users.id, args.id))
        .limit(1);
      return user[0] || null;
    },
  }),
);

builder.mutationField("updateProfile", (t) =>
  t.field({
    type: CurrentUserType,
    nullable: true,
    args: {
      firstName: t.arg.string(),
      lastName: t.arg.string(),
      artistName: t.arg.string(),
      description: t.arg.string(),
      tags: t.arg.stringList(),
    },
    resolve: async (_root, args, ctx) => {
      if (!ctx.currentUser) throw new GraphQLError("Unauthorized");

      const updates: Record<string, unknown> = { date_updated: new Date() };
      if (args.firstName !== undefined && args.firstName !== null) updates.first_name = args.firstName;
      if (args.lastName !== undefined && args.lastName !== null) updates.last_name = args.lastName;
      if (args.artistName !== undefined && args.artistName !== null) updates.artist_name = args.artistName;
      if (args.description !== undefined && args.description !== null) updates.description = args.description;
      if (args.tags !== undefined && args.tags !== null) updates.tags = args.tags;

      await ctx.db.update(users).set(updates as any).where(eq(users.id, ctx.currentUser.id));

      const updated = await ctx.db
        .select()
        .from(users)
        .where(eq(users.id, ctx.currentUser.id))
        .limit(1);
      return updated[0] || null;
    },
  }),
);
