import { sendErrorResponse, sendSuccessResponse } from "../../../utills/response";
import { Request, Response } from "express";
import { User } from "../../../database/user/user";
import { messages } from "../../../utills/common";
import { Notification } from "../../../database/notification/notification";
const bcrypt = require("bcrypt");

// Create new user
export const createUser = async (req: Request, res: Response) => {
    try {
        const { name, email, password, referredBy, 
            referredCode,  profileImg, accountName, accountNumber, address, bsbNumber, city, country, state, zipCode } = req.body;
        // Check if the email already exists in the database
        const existingUser = await User.findOne({ where: { email } });
        if (existingUser)  return sendErrorResponse(res, 400, messages.emailExists);
        const hashedPassword = await bcrypt.hash(password, 10);
        const newUser = await User.create({
            email, name, referredCode, referredBy, password: hashedPassword, profileImg, accountName, accountNumber, address, bsbNumber, city ,country, state, zipCode
        }).save();

        await Notification.create({
            userId: newUser.id,
            msg: messages.notificationRegisterMessage,
        }).save();

        return sendSuccessResponse(res, 200, messages.createUser, newUser);
    } catch (error) {
        return sendErrorResponse(res, 500, messages.errorMsg);
    }
};

//  Delete user by id
export const deleteUserById = async (req: Request, res: Response) => {
    try {
        const id = req.params.uuid;
        const deletionResult = await User.delete({ id });
        if (deletionResult.affected === 1) {
            return sendSuccessResponse(res, 200, messages.deleteUser, "");
        } else {
            return sendErrorResponse(res, 404, messages.userNotFound);
        }
    } catch (error) {
        return sendErrorResponse(res, 500, messages.errorMsg);
    }
};

//  get user by id
export const getUserByid = async (req: Request, res: Response) => {
    try {
        const id = req.params.id;
        const users = await User.createQueryBuilder("user")
        .where({id})
        .getOne();

        return sendSuccessResponse(res, 200, messages.getUser, users);
    } catch (error) {
        return sendErrorResponse(res, 500, messages.errorMsg);
    }
};

// Update user by id
export const updateUser = async (req: Request, res: Response) => {
    try {
        const { id, name,
            dob, phone, accountName, accountNumber, bsbNumber, address, country, state, city, zipCode } = req.body;
            const profileImg = req?.file?.filename ?? undefined;
            await User.createQueryBuilder()
            .update()
            .set({ name,
                 profileImg: profileImg, dob, phone, accountName, 
                 accountNumber, bsbNumber, address, country, state, city, zipCode })
            .where({ id })
            .execute();
            const updatedUser = await User.findOne({ where: { id } });

            return sendSuccessResponse(res, 200, messages.updateMsg, updatedUser);
    } catch (error) {
        return sendErrorResponse(res, 500, messages.errorMsg);
    }
};
