import { ACTOR_TYPES } from "../../item.js"
import { Misc } from "../../misc.js"
import { EXPORT_CSV_SCRIPTARIUM, OptionsAvancees } from "../../settings/options-avancees.js"
import { Mapping } from "./mapping.js"

const IMG_SCRIPTARIUM = '<img class="context-menu-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/scriptarium.svg">'

export class ExportScriptarium {

  static init() {
    ExportScriptarium.INSTANCE = new ExportScriptarium()
  }

  constructor() {
    Hooks.on("getActorDirectoryFolderContext", (actorDirectory, menus) => { ExportScriptarium.INSTANCE.onActorDirectoryMenu(actorDirectory, menus) })
    Hooks.on("getActorDirectoryEntryContext", (actorDirectory, menus) => { ExportScriptarium.INSTANCE.onActorDirectoryMenu(actorDirectory, menus) })
  }

  onActorDirectoryMenu(actorDirectory, menus) {
    menus.push({
      name: 'Export Personnages <i class="fa-regular fa-file-csv"></i>',
      icon: IMG_SCRIPTARIUM,
      condition: (target) => game.user.isGM &&
        OptionsAvancees.isUsing(EXPORT_CSV_SCRIPTARIUM) &&
        this.$getActors(actorDirectory, target).length > 0,
      callback: target => this.exportActors(this.$getActors(actorDirectory, target), this.$getTargetName(actorDirectory, target))
    })
  }

  $getTargetName(actorDirectory, target) {
    const li = target.closest(".directory-item")
    const folderId = li.data("folderId")
    const actorId = li.data("documentId")
    return actorId
      ? game.actors.get(actorId).name
      : actorDirectory.folders.find(it => it.id == folderId).name
  }

  $getActors(actorDirectory, target) {
    const li = target.closest(".directory-item")
    const folderId = li.data("folderId")
    const actorId = li.data("documentId")
    const actors = actorId
      ? [game.actors.get(actorId)]
      : folderId
        ? actorDirectory.folders.find(it => it.id == folderId).contents
        : []
    return actors.filter(it => it.type == ACTOR_TYPES.personnage)
  }

  exportActors(actors, targetName) {
    const eol = '\n\r'
    const header = Misc.join(this.getHeaderLine(), ';')
    const actorLines = actors.map(actor => Misc.join(this.getActorLine(actor), ';'))
    const data = Misc.join([header, ...actorLines], eol)
    const filename = `scriptarium-${targetName?.slugify()}.csv`;
    saveDataToFile(data, "text/csv;charset=windows-1252", `${filename}`);
  }

  getHeaderLine() {
    return Mapping.getColumns()
  }

  getActorLine(actor) {
    const values = Mapping.getValues(actor)
    return values
      .map(it => this.$escapeQuotes(it))
      .map(it => it.replaceAll("\n", " ").replaceAll("\r", ""))
  }

  $escapeQuotes(it) {
    it = '' + it
    if (it.includes('"') || it.includes(';')) {
      return `"${it.replaceAll('"', '\\"')}"`
    }
    return it
  }
}
