import { userRepo } from "@/server/repositories/user.repo";

export const userService = {
  /**
   * Suspend user oleh admin. Idempotent — kalau sudah suspended, tolak supaya
   * admin tahu (cegah race condition multiple admin suspend sekaligus).
   * Wajib reason untuk audit (min 10 char).
   */
  async suspendUser(input: {
    userId: string;
    adminId: string;
    reason: string;
  }) {
    if (input.userId === input.adminId) {
      throw new Error("Tidak bisa suspend akun sendiri");
    }
    const trimmedReason = input.reason.trim();
    if (trimmedReason.length < 10) {
      throw new Error("Alasan suspend wajib min 10 karakter untuk audit");
    }
    if (trimmedReason.length > 500) {
      throw new Error("Alasan suspend maksimal 500 karakter");
    }

    const target = await userRepo.findById(input.userId);
    if (!target) {
      throw new Error("User tidak ditemukan");
    }
    if (target.suspended) {
      throw new Error("User sudah dalam status suspended");
    }

    return userRepo.setSuspension(input.userId, {
      suspended: true,
      suspendedById: input.adminId,
      suspendedReason: trimmedReason,
    });
  },

  async unsuspendUser(input: { userId: string; adminId: string }) {
    if (input.userId === input.adminId) {
      throw new Error("Tidak bisa modifikasi akun sendiri");
    }
    const target = await userRepo.findById(input.userId);
    if (!target) {
      throw new Error("User tidak ditemukan");
    }
    if (!target.suspended) {
      throw new Error("User tidak dalam status suspended");
    }

    return userRepo.setSuspension(input.userId, { suspended: false });
  },
};
