
import { Request, Response } from "express";
import jwt from "jsonwebtoken";
import yenv from "yenv";
import { User } from "../../database/user/user";
import { RefreshToken } from "../../database/auth/refreshToken";
import { sendErrorResponse, sendSuccessResponse } from "../../utills/response";
import { messages } from "../../utills/common";
import crypto from "crypto";
const bcrypt = require("bcrypt");
const env = yenv("env.yaml", { env: "development" });

// Login user
export const adminLogin = async (req: Request, res: Response) => {
    try {
        const { email, password } = req.body;
        const user = await User.findOne({ where: { email } });

        if (user) {
            const isPasswordValid = await bcrypt.compare(password, user.password);
           if (!user?.isAdmin) {
                return sendErrorResponse(res, 404, messages.getUserByEmail);
            }
            else  if (isPasswordValid) {
                const tokenPayload = {
                    userId: user.id,
                    email: user.email,
                    role: 'admin'
                };
                const token = jwt.sign(tokenPayload, env.JWT_SECRET, { expiresIn: "15m" });

                const refreshTokenString = crypto.randomBytes(64).toString('hex');
                const refreshTokenExpiry = new Date();
                refreshTokenExpiry.setDate(refreshTokenExpiry.getDate() + 7);

                const refreshToken = RefreshToken.create({
                    token: refreshTokenString,
                    userId: user.id,
                    expiresAt: refreshTokenExpiry,
                    createdByIp: req.ip ?? req.connection.remoteAddress,
                });
                await refreshToken.save();

                return sendSuccessResponse(res, 200, messages.loginMsg, {
                    token,
                    refreshToken: refreshTokenString,
                    user: {
                        id: user.id,
                        name: user.name,
                        email: user.email,
                        isAdmin: user.isAdmin,
                        profileImg: user.profileImg,
                    }
                });
            }
             else {
                return sendErrorResponse(res, 401, messages.wrongPassword);
            }
        } else {
            return sendErrorResponse(res, 404, messages.getUserByEmail);
        }
    } catch (err) {
        console.error("Admin login error:", err);
        return sendErrorResponse(res, 500, messages.errorMsg);
    }
};
