/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/

var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
var __export = (target, all) => {
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
  if (from && typeof from === "object" || typeof from === "function") {
    for (let key of __getOwnPropNames(from))
      if (!__hasOwnProp.call(to, key) && key !== except)
        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
  }
  return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var __async = (__this, __arguments, generator) => {
  return new Promise((resolve, reject) => {
    var fulfilled = (value) => {
      try {
        step(generator.next(value));
      } catch (e) {
        reject(e);
      }
    };
    var rejected = (value) => {
      try {
        step(generator.throw(value));
      } catch (e) {
        reject(e);
      }
    };
    var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
    step((generator = generator.apply(__this, __arguments)).next());
  });
};

// main.ts
var main_exports = {};
__export(main_exports, {
  default: () => HeatmapCalendar
});
module.exports = __toCommonJS(main_exports);
var import_obsidian2 = require("obsidian");

// settings.ts
var import_obsidian = require("obsidian");
var HeatmapCalendarSettingsTab = class extends import_obsidian.PluginSettingTab {
  constructor(app, plugin) {
    super(app, plugin);
    this.plugin = plugin;
  }
  addColorMap(color) {
    return __async(this, null, function* () {
      const isValid = { key: true, value: true };
      if (!color.key)
        isValid.key = false;
      const validatedArray = this.validateColorInput(color.value);
      if (!validatedArray)
        isValid.value = false;
      if (isValid.key && isValid.value) {
        this.plugin.settings.colors[color.key] = validatedArray;
        yield this.plugin.saveSettings();
        this.display();
      }
      return isValid;
    });
  }
  deleteColorMap(key) {
    return __async(this, null, function* () {
      delete this.plugin.settings.colors[key];
      yield this.plugin.saveSettings();
      this.display();
    });
  }
  displayColorSettings() {
    const { containerEl } = this;
    containerEl.createEl("h3", { text: "Colors" });
    this.displayColorHelp(containerEl);
    for (const [key, colors] of Object.entries(this.plugin.settings.colors)) {
      const colorEntryContainer = containerEl.createDiv({
        cls: "heatmap-calendar-settings-colors__container"
      });
      const colorDataContainer = colorEntryContainer.createDiv({
        cls: "heatmap-calendar-settings-colors__data-container"
      });
      colorDataContainer.createEl("h4", { text: key });
      const colorRow = colorDataContainer.createDiv({ cls: "heatmap-calendar-settings-colors__row" });
      const colorsContainer = colorRow.createDiv({ cls: "heatmap-calendar-settings-colors__color-container" });
      for (const color of colors) {
        colorsContainer.createEl("div", {
          cls: "heatmap-calendar-settings-colors__color-box",
          attr: {
            style: `background-color: ${color}`
          }
        });
        colorsContainer.createEl("pre", {
          cls: "heatmap-calendar-settings-colors__color-name",
          text: color
        });
      }
      if (key !== "default") {
        const deleteColorButton = colorEntryContainer.createEl("button", {
          cls: "mod-warning heatmap-calendar-settings-colors__delete"
        });
        (0, import_obsidian.setIcon)(deleteColorButton, "trash");
        deleteColorButton.addEventListener("click", () => this.deleteColorMap(key));
      }
    }
    this.displayColorInput(containerEl);
  }
  displayColorInput(parent) {
    const inputContainer = parent.createDiv({ cls: "heatmap-calendar-settings-colors__new-color-input-container" });
    const colorNameInput = inputContainer.createEl("input", {
      cls: "heatmap-calendar-settings-colors__new-color-input-name",
      attr: { placeholder: "Color name", type: "text" }
    });
    const colorValueInput = inputContainer.createEl("input", {
      cls: "heatmap-calendar-settings-colors__new-color-input-value",
      attr: { placeholder: "Colors array", type: "text" }
    });
    const addColorButton = inputContainer.createEl("button", {
      cls: "mod-cta heatmap-calendar-settings-colors__new-color-button"
    });
    (0, import_obsidian.setIcon)(addColorButton, "plus");
    addColorButton.addEventListener("click", () => __async(this, null, function* () {
      const isValid = yield this.addColorMap({
        key: colorNameInput.value,
        value: colorValueInput.value
      });
      this.reportInputValidity(colorNameInput, isValid.key, "Please input a name for your color");
      this.reportInputValidity(colorValueInput, isValid.value, "Color is not a valid JSON array of colors");
    }));
  }
  displayColorHelp(parent) {
    parent.createEl("p", {
      text: "Add lists of colors which will be globally available on your heatmaps."
    });
    parent.createEl("p", {
      text: "You can use those colors by referencing their name in your heatmap render settings."
    });
  }
  reportInputValidity(input, isValid, msg) {
    if (!isValid) {
      input.classList.add("has-error");
      input.setCustomValidity(msg);
    } else
      input.setCustomValidity("");
    input.reportValidity();
  }
  validateColorInput(value) {
    const colorRegex = /^(#[0-9a-f]{3,6}|rgba?\(\s*\d+%?\s*,\s*\d+%?\s*,\s*\d+%?\s*(,\s*\d+(\.\d+)?%?)?\s*\))$/i;
    try {
      const data = JSON.parse(value);
      if (!Array.isArray(data))
        return false;
      return data.every((color) => colorRegex.test(color)) ? data : false;
    } catch (e) {
      return false;
    }
  }
  display() {
    const { containerEl } = this;
    containerEl.empty();
    containerEl.createEl("h2", { text: "Heatmap Calendar Settings" });
    this.displayColorSettings();
    console.log("settings", this.plugin.settings);
  }
};

// main.ts
var DEFAULT_SETTINGS = {
  year: new Date().getFullYear(),
  colors: {
    default: ["#c6e48b", "#7bc96f", "#49af5d", "#2e8840", "#196127"]
  },
  entries: [{ date: "1900-01-01", color: "#7bc96f", intensity: 5, content: "" }],
  showCurrentDayBorder: true,
  defaultEntryIntensity: 4,
  intensityScaleStart: 1,
  intensityScaleEnd: 5
};
var HeatmapCalendar = class extends import_obsidian2.Plugin {
  getHowManyDaysIntoYear(date) {
    return (Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()) - Date.UTC(date.getUTCFullYear(), 0, 0)) / 24 / 60 / 60 / 1e3;
  }
  getHowManyDaysIntoYearLocal(date) {
    return (Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()) - Date.UTC(date.getFullYear(), 0, 0)) / 24 / 60 / 60 / 1e3;
  }
  removeHtmlElementsNotInYear(entries, year) {
    var _a;
    const calEntriesNotInDisplayedYear = (_a = entries.filter((e) => new Date(e.date).getFullYear() !== year)) != null ? _a : this.settings.entries;
    calEntriesNotInDisplayedYear.forEach((e) => e.content instanceof HTMLElement && e.content.remove());
  }
  clamp(input, min, max) {
    return input < min ? min : input > max ? max : input;
  }
  map(current, inMin, inMax, outMin, outMax) {
    const mapped = (current - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;
    return this.clamp(mapped, outMin, outMax);
  }
  onload() {
    return __async(this, null, function* () {
      yield this.loadSettings();
      this.addSettingTab(new HeatmapCalendarSettingsTab(this.app, this));
      window.renderHeatmapCalendar = (el, calendarData) => {
        var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
        const year = (_a = calendarData.year) != null ? _a : this.settings.year;
        const colors = typeof calendarData.colors === "string" ? this.settings.colors[calendarData.colors] ? { [calendarData.colors]: this.settings.colors[calendarData.colors] } : this.settings.colors : (_b = calendarData.colors) != null ? _b : this.settings.colors;
        this.removeHtmlElementsNotInYear(calendarData.entries, year);
        const calEntries = (_c = calendarData.entries.filter((e) => new Date(e.date + "T00:00").getFullYear() === year)) != null ? _c : this.settings.entries;
        const showCurrentDayBorder = (_d = calendarData.showCurrentDayBorder) != null ? _d : this.settings.showCurrentDayBorder;
        const defaultEntryIntensity = (_e = calendarData.defaultEntryIntensity) != null ? _e : this.settings.defaultEntryIntensity;
        const intensities = calEntries.filter((e) => e.intensity).map((e) => e.intensity);
        const minimumIntensity = intensities.length ? Math.min(...intensities) : this.settings.intensityScaleStart;
        const maximumIntensity = intensities.length ? Math.max(...intensities) : this.settings.intensityScaleEnd;
        const intensityScaleStart = (_f = calendarData.intensityScaleStart) != null ? _f : minimumIntensity;
        const intensityScaleEnd = (_g = calendarData.intensityScaleEnd) != null ? _g : maximumIntensity;
        const mappedEntries = [];
        calEntries.forEach((e) => {
          var _a2;
          const newEntry = __spreadValues({
            intensity: defaultEntryIntensity
          }, e);
          const colorIntensities = typeof colors === "string" ? this.settings.colors[colors] : (_a2 = colors[e.color]) != null ? _a2 : colors[Object.keys(colors)[0]];
          const numOfColorIntensities = Object.keys(colorIntensities).length;
          if (minimumIntensity === maximumIntensity && intensityScaleStart === intensityScaleEnd)
            newEntry.intensity = numOfColorIntensities;
          else
            newEntry.intensity = Math.round(this.map(newEntry.intensity, intensityScaleStart, intensityScaleEnd, 1, numOfColorIntensities));
          mappedEntries[this.getHowManyDaysIntoYear(new Date(e.date))] = newEntry;
        });
        const firstDayOfYear = new Date(Date.UTC(year, 0, 1));
        let numberOfEmptyDaysBeforeYearBegins = (firstDayOfYear.getUTCDay() + 6) % 7;
        const boxes = [];
        while (numberOfEmptyDaysBeforeYearBegins) {
          boxes.push({ backgroundColor: "transparent" });
          numberOfEmptyDaysBeforeYearBegins--;
        }
        const lastDayOfYear = new Date(Date.UTC(year, 11, 31));
        const numberOfDaysInYear = this.getHowManyDaysIntoYear(lastDayOfYear);
        const todaysDayNumberLocal = this.getHowManyDaysIntoYearLocal(new Date());
        for (let day = 1; day <= numberOfDaysInYear; day++) {
          const box = {
            classNames: []
          };
          if (day === todaysDayNumberLocal && showCurrentDayBorder)
            (_h = box.classNames) == null ? void 0 : _h.push("today");
          if (mappedEntries[day]) {
            (_i = box.classNames) == null ? void 0 : _i.push("hasData");
            const entry = mappedEntries[day];
            box.date = entry.date;
            if (entry.content)
              box.content = entry.content;
            const currentDayColors = entry.color ? colors[entry.color] : colors[Object.keys(colors)[0]];
            box.backgroundColor = currentDayColors[entry.intensity - 1];
          } else
            (_j = box.classNames) == null ? void 0 : _j.push("isEmpty");
          boxes.push(box);
        }
        const heatmapCalendarGraphDiv = createDiv({
          cls: "heatmap-calendar-graph",
          parent: el
        });
        createDiv({
          cls: "heatmap-calendar-year",
          text: String(year).slice(2),
          parent: heatmapCalendarGraphDiv
        });
        const heatmapCalendarMonthsUl = createEl("ul", {
          cls: "heatmap-calendar-months",
          parent: heatmapCalendarGraphDiv
        });
        createEl("li", { text: "Jan", parent: heatmapCalendarMonthsUl });
        createEl("li", { text: "Feb", parent: heatmapCalendarMonthsUl });
        createEl("li", { text: "Mar", parent: heatmapCalendarMonthsUl });
        createEl("li", { text: "Apr", parent: heatmapCalendarMonthsUl });
        createEl("li", { text: "May", parent: heatmapCalendarMonthsUl });
        createEl("li", { text: "Jun", parent: heatmapCalendarMonthsUl });
        createEl("li", { text: "Jul", parent: heatmapCalendarMonthsUl });
        createEl("li", { text: "Aug", parent: heatmapCalendarMonthsUl });
        createEl("li", { text: "Sep", parent: heatmapCalendarMonthsUl });
        createEl("li", { text: "Oct", parent: heatmapCalendarMonthsUl });
        createEl("li", { text: "Nov", parent: heatmapCalendarMonthsUl });
        createEl("li", { text: "Dec", parent: heatmapCalendarMonthsUl });
        const heatmapCalendarDaysUl = createEl("ul", {
          cls: "heatmap-calendar-days",
          parent: heatmapCalendarGraphDiv
        });
        createEl("li", { text: "Mon", parent: heatmapCalendarDaysUl });
        createEl("li", { text: "Tue", parent: heatmapCalendarDaysUl });
        createEl("li", { text: "Wed", parent: heatmapCalendarDaysUl });
        createEl("li", { text: "Thu", parent: heatmapCalendarDaysUl });
        createEl("li", { text: "Fri", parent: heatmapCalendarDaysUl });
        createEl("li", { text: "Sat", parent: heatmapCalendarDaysUl });
        createEl("li", { text: "Sun", parent: heatmapCalendarDaysUl });
        const heatmapCalendarBoxesUl = createEl("ul", {
          cls: "heatmap-calendar-boxes",
          parent: heatmapCalendarGraphDiv
        });
        boxes.forEach((e) => {
          const entry = createEl("li", {
            attr: __spreadValues(__spreadValues({}, e.backgroundColor && { style: `background-color: ${e.backgroundColor};` }), e.date && { "data-date": e.date }),
            cls: e.classNames,
            parent: heatmapCalendarBoxesUl
          });
          createSpan({
            cls: "heatmap-calendar-content",
            parent: entry,
            text: e.content
          });
        });
      };
    });
  }
  onunload() {
  }
  loadSettings() {
    return __async(this, null, function* () {
      console.log("heyoh", yield this.loadData());
      this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData());
    });
  }
  saveSettings() {
    return __async(this, null, function* () {
      yield this.saveData(this.settings);
    });
  }
};
