let flashActive = false;
const flashTypes = [ "error", "success", "warn" ];

const flash = ({ type, msg }) => {
  let flashContainer;
  if(tmp = document.querySelector("div#flash"))
    flashContainer = tmp;
  else {
    flashContainer = document.createElement("div");
    flashContainer.id = "flash";
    document.body.insertAdjacentElement("afterbegin", flashContainer);
  }

  flashContainer.innerHTML = msg;
  if(flashTypes.includes(type)) {
    flashContainer.className = "";
    flashContainer.classList.add(type);
  }
  if(flashActive)
    return false;

  flashActive = true;
  flashContainer.animate(
    [ { bottom: "-28px" }, { bottom: 0 } ], {
      duration: 500,
      fill: "both"
    }
  ).onfinish = () => setTimeout(() => {
    flashContainer.animate(
      [ { bottom: 0 }, { bottom: "-28px" } ], {
        duration: 500,
        fill: "both"
      }
    ).onfinish = () => flashActive = false;
  }, 4 * 1e3);
  return true;
};

(async () => {
  if(_addtag = document.querySelector("a#a_addtag")) {
    const postid = +document.querySelector("a.id-link").innerText;
    const poster = document.querySelector("a#a_username").innerText;
    let tags = [...document.querySelectorAll("#tags > .badge")].map(t => t.innerText.slice(0, -2));

    const deleteEvent = async e => {
      e.preventDefault();
      if(!confirm("Do you really want to delete this tag?"))
        return;
      const tag = e.target.parentElement.innerText.slice(0, -2);
      if(!tags.includes(tag))
        return alert("wtf");
      const res = await deleteTag(postid, tag);
      if(!res.success)
        return alert("uff");
      tags = res.tags.map(t => t.tag);
      renderTags(res.tags);
    };
  
    const post = async (url, data) => fetch(url, {
      method: "POST",
      headers: {
        "Content-Type": "application/json"
      },
      body: JSON.stringify(data)
    });
  
    const getTags = async postid => await (await fetch("/api/v2/admin/tags/get/" + postid)).json();

    const deletePost = async postid => await (await fetch("/api/v2/admin/deletepost/" + postid)).json();
  
    const addTag = async (postid, tag) => await (await post("/api/v2/admin/tags/add", {
      postid: postid,
      tag: tag
    })).json();
  
    const deleteTag = async (postid, tag) => await (await post("/api/v2/admin/tags/delete", {
      postid: postid,
      tag: tag
    })).json();
  
    const renderTags = _tags => {
      [...document.querySelectorAll("#tags > .badge")].forEach(tag => tag.parentElement.removeChild(tag));
      _tags.reverse().forEach(tag => {
        const a = document.createElement("a");
        a.href = `/admin/test?tag=${tag.tag.replace(/\s/g, "+")}`;
        a.target = "_blank";
        a.style = "color: inherit !important";
        a.innerText = tag.tag;

        const span = document.createElement("span");
        span.classList.add("badge", "badge-light", "mr-2");
        span.title = tag.prefix;
        if(tag.tag == "sfw") {
          span.classList.remove("badge-light");
          span.classList.add("badge-success");
        }
        if(tag.tag == "nsfw") {
          span.classList.remove("badge-light");
          span.classList.add("badge-danger");
        }
        if(tag.tag.startsWith(">")) {
          span.classList.add("badge-greentext");
        }

        const delbutton = document.createElement("a");
        delbutton.innerHTML = " &#215;";
        delbutton.href = "#";
        delbutton.addEventListener("click", deleteEvent);
        span.insertAdjacentElement("beforeend", a);
        span.insertAdjacentElement("beforeend", delbutton);
  
        document.querySelector("#tags").insertAdjacentElement("afterbegin", span);
      });
    };

    const addtagClick = (ae = false) => {
      if(ae)
        ae.preventDefault();

      const insert = document.querySelector("a#a_addtag");
      const span = document.createElement("span");
      span.classList.add("badge", "badge-light", "mr-2");

      const input = document.createElement("input");
      input.size = "10";
      input.value = "";

      let tt;
      input.addEventListener("keydown", async e => {
        if(e.key === "Enter") {
          const tmptag = input.value;
          if(tags.includes(tmptag))
            return alert("tag already exists");
          const res = await addTag(postid, tmptag);
          if(!res.success) {
            return flash({
              type: "error",
              msg: res.msg
            });
          }
          tags = res.tags.map(t => t.tag);
          renderTags(res.tags);
          addtagClick();
        }
        else if(e.key === "Escape") {
          span.parentElement.removeChild(span);
        }
        return true;
      });

      span.insertAdjacentElement("afterbegin", input);
      insert.insertAdjacentElement("beforebegin", span);

      input.focus();

      input.addEventListener("focusout", ie => {
        if(input.value.length === 0)
          input.parentElement.parentElement.removeChild(input.parentElement);
      });
    };

    const toggleEvent = async (e = false) => {
      if(e)
        e.preventDefault();
      let res;
      if(tags.includes("sfw")) {
        await deleteTag(postid, "sfw");
        res = await addTag(postid, "nsfw");
      }
      else if(tags.includes("nsfw")) {
        await deleteTag(postid, "nsfw");
        res = await addTag(postid, "sfw");
      }
      else
        res = await addTag(postid, "sfw");
      
      if(!res.success)
        return flash({
          type: "error",
          msg: res.msg
        });

      renderTags(res.tags);
      tags = res.tags.map(t => t.tag);

      flash({
        type: "success",
        msg: tags.join()
      });
    };

    const deleteButtonEvent = async e => {
      if(e)
        e.preventDefault();
      if(!confirm(`Reason for deleting f0ckpost ${postid} by ${poster} (Weihnachten™)`))
        return;
      const res = await deletePost(postid);
      if(res.success) {
        flash({
          type: "success",
          msg: "post was successfully deleted"
        });
      }
      else {
        flash({
          type: "error",
          msg: res.msg
        });
      }
    };

    _addtag.addEventListener("click", addtagClick);
    document.querySelector("a#a_toggle").addEventListener("click", toggleEvent);
    [...document.querySelectorAll("#tags > .badge > a:last-child")].map(t => t.addEventListener("click", deleteEvent));
    document.querySelector("a#a_delete").addEventListener("click", deleteButtonEvent);

    document.addEventListener("keyup", e => {
      if(e.target.tagName === "INPUT")
        return;
      if(e.key === "p")
        toggleEvent();
      else if(e.key === "i")
        addtagClick();
      else if(e.key === "x")
        deleteButtonEvent();
    });
  }
})();
