const fs = require("fs");
const axios = require("axios");
const { createCanvas, loadImage } = require("canvas");
const pathData = __dirname + "/rankData.json";

// Kiểm tra & tạo file dữ liệu
if (!fs.existsSync(pathData)) fs.writeFileSync(pathData, JSON.stringify({}, null, 2));

const getRankData = () => JSON.parse(fs.readFileSync(pathData));
const saveRankData = (data) => fs.writeFileSync(pathData, JSON.stringify(data, null, 2));

module.exports.config = {
  name: "rank",
  version: "2.0.0",
  hasPermission: 0,
  credits: "vh + ChatGPT",
  description: "Xem cấp bậc Rank Card và tu tiên",
  commandCategory: "Tiện ích",
  usages: "[tag]",
  cooldowns: 5
};

// Hàm tính level từ EXP (nếu muốn đổi công thức lũy tiến, sửa expToLevelUp)
function expToLevelUp(level) {
  return Math.floor(100 * Math.pow(1.2, level-1)); // Lũy tiến
}

// Hàm lấy cảnh giới + tiểu cảnh
function getCultivationRealm(level) {
  const realms = [
    "Luyện Khí","Trúc Cơ","Khai Quang","Kim Đan","Nguyên Anh",
    "Hóa Thần","Phản Hư","Luyện Hư","Hợp Thể","Đại Thừa",
    "Độ Kiếp","Thiên Tiên","Chân Tiên","Kim Tiên","Thánh Nhân"
  ];
  const subRealms = ["Sơ Kỳ","Nhị Kỳ","Tam Kỳ","Tứ Kỳ","Ngũ Kỳ","Lục Kỳ","Thất Kỳ","Bát Kỳ","Cửu Kỳ","Thập Kỳ"];
  const levelsPerRealm = 10;
  const totalLevels = realms.length * levelsPerRealm;
  if (level < 1) return "Phàm Nhân";
  if (level > totalLevels) return "Đạo Tổ";
  const realmIndex = Math.floor((level-1)/levelsPerRealm);
  const subIndex = (level-1)%levelsPerRealm;
  return `${realms[realmIndex]} ${subRealms[subIndex]}`;
}

// Tạo Rank Card
async function createRankCard(api, userID, userName, level, exp, expNext) {
  const width = 800, height = 300;
  const canvas = createCanvas(width, height);
  const ctx = canvas.getContext("2d");

  // Nền
  const background = await loadImage("https://i.imgur.com/RueGAGI.jpg");
  ctx.drawImage(background, 0, 0, width, height);

  // Avatar tròn
  const userInfo = await api.getUserInfo(userID);
  const avatarURL = userInfo[userID]?.thumbSrc || "https://i.imgur.com/2uUVNWK.png";
  const avatar = await loadImage(avatarURL);
  ctx.save();
  ctx.beginPath();
  ctx.arc(100, 150, 80, 0, Math.PI*2);
  ctx.closePath();
  ctx.clip();
  ctx.drawImage(avatar, 20, 70, 160, 160);
  ctx.restore();

  // Thông tin
  ctx.fillStyle = "#fff";
  ctx.font = "bold 30px Arial";
  ctx.fillText(userName, 220, 70);
  ctx.fillText(`Level ${level}`, 220, 110);
  ctx.font = "20px Arial";
  ctx.fillText(`EXP: ${exp}/${expNext}`, 220, 150);
  ctx.fillText(`Cảnh giới: ${getCultivationRealm(level)}`, 220, 190);

  // Thanh EXP
  ctx.fillStyle = "#555";
  ctx.fillRect(220, 210, 500, 20);
  ctx.fillStyle = "#00ff00";
  ctx.fillRect(220, 210, Math.min((exp/expNext)*500, 500), 20);
  ctx.strokeStyle = "#fff";
  ctx.lineWidth = 2;
  ctx.strokeRect(220, 210, 500, 20);

  const imgPath = __dirname + `/rank_card_${userID}.png`;
  fs.writeFileSync(imgPath, canvas.toBuffer());
  return imgPath;
}

// Lệnh xem Rank
module.exports.run = async ({ event, api }) => {
  const rankData = getRankData();
  const mention = Object.keys(event.mentions);
  const userID = mention.length ? mention[0] : event.senderID;

  if (!rankData[userID]) return api.sendMessage("Người này chưa có cấp bậc nào.", event.threadID);

  const { exp, level } = rankData[userID];
  const expNext = expToLevelUp(level);
  const userInfo = await api.getUserInfo(userID);
  const userName = userInfo[userID]?.name || "Người dùng";
  const imgPath = await createRankCard(api, userID, userName, level, exp, expNext);

  api.sendMessage(
    { body: `🌟 Cấp bậc của ${userName}:`, attachment: fs.createReadStream(imgPath) },
    event.threadID,
    () => fs.unlinkSync(imgPath)
  );
};

// Tự động cộng EXP khi nhắn tin & thông báo tu tiên
module.exports.handleEvent = async ({ event, api }) => {
  if (!event.body || event.isGroup === false) return;

  const rankData = getRankData();
  const userID = event.senderID;

  if (!rankData[userID]) rankData[userID] = { exp: 0, level: 1 };

  const expGain = Math.floor(Math.random()*10) + 5; // 5-14 EXP/tin nhắn
  rankData[userID].exp += expGain;

  let expNext = expToLevelUp(rankData[userID].level);
  if (rankData[userID].exp >= expNext) {
    rankData[userID].exp -= expNext;
    rankData[userID].level += 1;
    expNext = expToLevelUp(rankData[userID].level);

    const userInfo = await api.getUserInfo(userID);
    const userName = userInfo[userID]?.name || "Người dùng";
    const realm = getCultivationRealm(rankData[userID].level);
    const imgPath = await createRankCard(api, userID, userName, rankData[userID].level, rankData[userID].exp, expNext);

    api.sendMessage(
      { body: `🌟✨ Chúc mừng ${userName} đã đột phá lên **${realm}**!`, attachment: fs.createReadStream(imgPath) },
      event.threadID,
      () => fs.unlinkSync(imgPath),
      event.messageID
    );
  }

  saveRankData(rankData);
};
