const fs = require("fs");
const path = require("path");
const { execSync } = require("child_process");

function getBranchName() {
  return execSync("git rev-parse --abbrev-ref HEAD").toString().trim();
}

function formatCommitMessageFromBranchName(branchName) {
  // Vérifie si le nom de la branche suit le format "type-(ID_TIKET)-nom_de_fonctionnalité"
  const typeAllowed = [
    "feat",
    "fix",
    "docs",
    "style",
    "refactor",
    "test",
    "chore",
  ];
  const typeRegex = typeAllowed.join("|");
  const regex = new RegExp(`^(${typeRegex})-([0-9]+)-(.+)$`);
  const match = branchName.match(regex);
  const regexWithoutTicket = new RegExp(`^(${typeRegex})-(.+)$`);
  const matchWithoutTicket = branchName.match(regexWithoutTicket);
  if (match) {
    const type = match[1];
    const idTicket = match[2];
    const featureName = match[3];
    return `${type}: ${featureName.replace(/[-_]/g, " ")} [#${idTicket}]`;
  } else if (matchWithoutTicket) {
    const type = matchWithoutTicket[1];
    const featureName = matchWithoutTicket[2];
    return `${type}: ${featureName.replace(/[-_]/g, " ")}`;
  }
  return null;
}

/**
 * Ajoute le contenu du fichier template au message de commit
 * @param {*} commitMsg
 */
function getCommitTemplateMsg() {
  // Fichier template
  const TEMPLATE_FILE = path.join(__dirname, "./commit-template.txt");
  // Vérifie si le fichier template existe
  if (fs.existsSync(TEMPLATE_FILE)) {
    try {
      // Lit le fichier template
      const templateContent = fs.readFileSync(TEMPLATE_FILE, "utf8");
      // Ajoute le contenu du template au message de commit
      return `${templateContent}`;
    } catch (error) {
      console.error(
        "Erreur lors de la modification du message de commit :",
        error
      );
      process.exit(1);
    }
  } else {
    console.warn(`Fichier template introuvable : ${TEMPLATE_FILE}`);
  }
}

// ----------------------------------------------------
// MAIN
// ----------------------------------------------------

// Arguments passés par Husky
const commitMsgFile = process.argv[2];
const commitType = process.argv[3];

// Vérifie si le commit est interactif
if (commitType === "message" || commitType === "template") {
  process.exit(0);
}

const currentCommitMessage = fs.readFileSync(commitMsgFile, "utf8");
const branchName = getBranchName();
const newBranchMessage = formatCommitMessageFromBranchName(branchName);
let newCommitMessage = "";

if (newBranchMessage) {
  // Vérifie si le message de commit est déjà présent
  const messageRegex = new RegExp(`^${newBranchMessage}`, "m");
  if (!messageRegex.test(currentCommitMessage)) {
    newCommitMessage = `${newBranchMessage}\n${getCommitTemplateMsg()}\n${currentCommitMessage}`;
  } else {
    // Si le message de commit est déjà présent, on ne fait rien
    newCommitMessage = currentCommitMessage;
  }
} else {
  newCommitMessage = `${currentCommitMessage}\n${getCommitTemplateMsg()}`;
}

fs.writeFileSync(commitMsgFile, newCommitMessage);
