import { FlowExecCtx } from "@/core/flow.execution.context";
import { ERROR_CODES, type Err } from "@pkg/result";
import { getError } from "@pkg/logger";

export const userErrors = {
    dbError: (fctx: FlowExecCtx, detail: string): Err =>
        getError({
            flowId: fctx.flowId,
            code: ERROR_CODES.DATABASE_ERROR,
            message: "Database operation failed",
            description: "Please try again later",
            detail,
        }),

    userNotFound: (fctx: FlowExecCtx): Err =>
        getError({
            flowId: fctx.flowId,
            code: ERROR_CODES.NOT_FOUND,
            message: "User not found",
            description: "Try with a different user id",
            detail: "User not found in database",
        }),

    usernameCheckFailed: (fctx: FlowExecCtx, detail: string): Err =>
        getError({
            flowId: fctx.flowId,
            code: ERROR_CODES.DATABASE_ERROR,
            message: "An error occurred while checking username availability",
            description: "Try again later",
            detail,
        }),

    banOperationFailed: (fctx: FlowExecCtx, detail: string): Err =>
        getError({
            flowId: fctx.flowId,
            code: ERROR_CODES.DATABASE_ERROR,
            message: "Failed to perform ban operation",
            description: "Please try again later",
            detail,
        }),

    unbanFailed: (fctx: FlowExecCtx, detail: string): Err =>
        getError({
            flowId: fctx.flowId,
            code: ERROR_CODES.DATABASE_ERROR,
            message: "Failed to unban user",
            description: "Please try again later",
            detail,
        }),

    updateFailed: (fctx: FlowExecCtx, detail: string): Err =>
        getError({
            flowId: fctx.flowId,
            code: ERROR_CODES.DATABASE_ERROR,
            message: "Failed to update user",
            description: "Please try again later",
            detail,
        }),

    getUserInfoFailed: (fctx: FlowExecCtx, detail: string): Err =>
        getError({
            flowId: fctx.flowId,
            code: ERROR_CODES.DATABASE_ERROR,
            message: "An error occurred while getting user info",
            description: "Try again later",
            detail,
        }),

    getBanInfoFailed: (fctx: FlowExecCtx, detail: string): Err =>
        getError({
            flowId: fctx.flowId,
            code: ERROR_CODES.DATABASE_ERROR,
            message: "An error occurred while getting ban info",
            description: "Try again later",
            detail,
        }),
};
