const storage = require("Storage");

type Tally = {
  date: Date,
  name: string,
};

function readTallies() {
  const tallies: Tally[] = [];
  const f = storage.open("tallies.csv", "r");
  let line;
  while ((line = f.readLine()) !== undefined) {
    const parts = line.replace("\n", "").split(",");
    tallies.push({ date: new Date(parts[0]), name: parts[1] });
  }
  return tallies;
}

function saveTallies(tallies: Tally[]) {
  const f = storage.open("tallies.csv", "w");
  for(const tally of tallies){
    f.write([tally.date.toISOString(), tally.name].join(",") + "\n");
  }
}

const dayEq = (a: Date, b: Date) =>
  a.getFullYear() === b.getFullYear()
    && a.getMonth() === b.getMonth()
    && a.getDate() === b.getDate();

function showTallies(tallies: Tally[]) {
  const menu: Menu = {
    "": { title: "Tallies" },
    "< Back": () => load(),
  };

  const today = new Date;
  let day: undefined | Date;

  tallies.forEach((tally, i) => {
    const td = tally.date;
    if(!dayEq(day ?? today, td)){
      const s = `${td.getFullYear()}-${pad2(td.getMonth() + 1)}-${pad2(td.getDate())}`;
      menu[s] = () => {};
      day = td;
    }

    let title = `${tfmt(tally)}: ${tally.name}`;
    let n = 2;
    while(title in menu){
      title = `${tfmt(tally)} (${n}): ${tally.name}`
      n++;
    }
    menu[title] = () => editTally(tallies, i);
  });

  E.showMenu(menu);
}

function editTally(tallies: Tally[], i: number) {
  const tally = tallies[i]!;

  const onback = () => {
    saveTallies(tallies);
    E.removeListener("kill", onback);
  };
  E.on("kill", onback);

  const menu: Menu = {
    "": { title: `Edit ${tally.name}` },
    "< Back": () => {
      onback();
      showTallies(tallies)
    },
    "Name": {
      value: tally.name,
      onchange: () => {
        setTimeout(() => {
          require("textinput")
            .input({ text: tally.name })
            .then(text => {
              if (text) {
                tally.name = text;
              }
              editTally(tallies, i);
            });
        }, 0);
      },
    },
    "Time": {
      value: tally.date.getTime(),
      format: (_tm: number) => tfmt(tally),
      onchange: (v: number) => {
        tally.date = new Date(v);
      },
      step: 60000, // 1 min
    },
    "Delete": () => {
      E.showPrompt(`Delete "${tally.name}"?`, {
        title: "Delete",
        buttons: { Yes: true, No: false },
      }).then(confirm => {
        if (confirm) {
          tallies.splice(i, 1);
          saveTallies(tallies);
          showTallies(tallies);
          return;
        }

        // need to regrab ui, can't `m.draw()`
        editTally(tallies, i);
      });
    },
  };

  E.showMenu(menu);
}

function tfmt(tally: Tally) {
  const d = tally.date;
  return `${d.getHours()}:${pad2(d.getMinutes())}`;
}

const pad2 = (s: number) => ("0" + s.toFixed(0)).slice(-2);

showTallies(readTallies());
