import { DatabaseError } from "@/lib/error";
import type { RepositoryContext } from "../datastore/repository";
import { BaseRepository } from "../datastore/repository";

// `users` rows for members live in the Updot member database, so this is a
// member-DB scoped counterpart of the console user repository.
export const MemberUserRepository = (ctx: RepositoryContext) => {
  const { memberDatastore: datastore } = new BaseRepository(ctx);

  const FindUserByID = async (id: string) => {
    try {
      const record = await datastore
        .selectFrom("users")
        .select([
          "id",
          "email",
          "_is_active",
          "_is_deleted",
          "pid",
          "created_at",
          "updated_at",
        ])
        .where("id", "=", id)
        .executeTakeFirst();
      return record ?? null;
    } catch (error) {
      throw new DatabaseError({ error, message: "Find member user by ID" });
    }
  };

  const UpdateUserPassword = async (entry: {
    email: string;
    hashed_password: string;
  }) => {
    try {
      return await datastore
        .updateTable("users")
        .set({
          hashed_password: entry.hashed_password,
          updated_at: new Date().toISOString().replace(/\.\d{3}Z$/, "Z"),
        })
        .where("email", "=", entry.email.toLowerCase())
        .executeTakeFirstOrThrow();
    } catch (error) {
      throw new DatabaseError({
        error,
        message: "Update member user password",
      });
    }
  };

  return { FindUserByID, UpdateUserPassword };
};

export type TMemberUserRepository = ReturnType<typeof MemberUserRepository>;
