app.views.Mobile = class Mobile extends app.View {
  static className = "_mobile";

  static elements = {
    body: "body",
    content: "._container",
    sidebar: "._sidebar",
    docPicker: "._settings ._sidebar",
  };

  static shortcuts = { escape: "onEscape" };

  static routes = { after: "afterRoute" };

  static detect() {
    if (Cookies.get("override-mobile-detect") != null) {
      return JSON.parse(Cookies.get("override-mobile-detect"));
    }
    try {
      return (
        window.matchMedia("(max-width: 480px)").matches ||
        window.matchMedia("(max-width: 767px)").matches ||
        window.matchMedia("(max-height: 767px) and (max-width: 1024px)")
          .matches ||
        // Need to sniff the user agent because some Android and Windows Phone devices don't take
        // resolution (dpi) into account when reporting device width/height.
        (navigator.userAgent.includes("Android") &&
          navigator.userAgent.includes("Mobile")) ||
        navigator.userAgent.includes("IEMobile")
      );
    } catch (error) {
      return false;
    }
  }

  static detectAndroidWebview() {
    try {
      return /(Android).*( Version\/.\.. ).*(Chrome)/.test(navigator.userAgent);
    } catch (error) {
      return false;
    }
  }

  constructor() {
    super(document.documentElement);
  }

  init() {
    $.on($("._search"), "touchend", () => this.onTapSearch());

    this.toggleSidebar = $("button[data-toggle-sidebar]");
    this.toggleSidebar.removeAttribute("hidden");
    $.on(this.toggleSidebar, "click", () => this.onClickToggleSidebar());

    this.back = $("button[data-back]");
    this.back.removeAttribute("hidden");
    $.on(this.back, "click", () => this.onClickBack());

    this.forward = $("button[data-forward]");
    this.forward.removeAttribute("hidden");
    $.on(this.forward, "click", () => this.onClickForward());

    this.docPickerTab = $('button[data-tab="doc-picker"]');
    this.docPickerTab.removeAttribute("hidden");
    $.on(this.docPickerTab, "click", (event) =>
      this.onClickDocPickerTab(event),
    );

    this.settingsTab = $('button[data-tab="settings"]');
    this.settingsTab.removeAttribute("hidden");
    $.on(this.settingsTab, "click", (event) => this.onClickSettingsTab(event));

    app.document.sidebar.search.on("searching", () => this.showSidebar());

    this.activate();
  }

  showSidebar() {
    let selection;
    if (this.isSidebarShown()) {
      window.scrollTo(0, 0);
      return;
    }

    this.contentTop = window.scrollY;
    this.content.style.display = "none";
    this.sidebar.style.display = "block";

    if ((selection = this.findByClass(app.views.ListSelect.activeClass))) {
      const scrollContainer =
        window.scrollY === this.body.scrollTop
          ? this.body
          : document.documentElement;
      $.scrollTo(selection, scrollContainer, "center");
    } else {
      window.scrollTo(
        0,
        (this.findByClass(app.views.ListFold.activeClass) && this.sidebarTop) ||
          0,
      );
    }
  }

  hideSidebar() {
    if (!this.isSidebarShown()) {
      return;
    }
    this.sidebarTop = window.scrollY;
    this.sidebar.style.display = "none";
    this.content.style.display = "block";
    window.scrollTo(0, this.contentTop || 0);
  }

  isSidebarShown() {
    return this.sidebar.style.display !== "none";
  }

  onClickBack() {
    return history.back();
  }

  onClickForward() {
    return history.forward();
  }

  onClickToggleSidebar() {
    if (this.isSidebarShown()) {
      this.hideSidebar();
    } else {
      this.showSidebar();
    }
  }

  onClickDocPickerTab(event) {
    $.stopEvent(event);
    this.showDocPicker();
  }

  onClickSettingsTab(event) {
    $.stopEvent(event);
    this.showSettings();
  }

  showDocPicker() {
    window.scrollTo(0, 0);
    this.docPickerTab.classList.add("active");
    this.settingsTab.classList.remove("active");
    this.docPicker.style.display = "block";
    this.content.style.display = "none";
  }

  showSettings() {
    window.scrollTo(0, 0);
    this.docPickerTab.classList.remove("active");
    this.settingsTab.classList.add("active");
    this.docPicker.style.display = "none";
    this.content.style.display = "block";
  }

  onTapSearch() {
    return window.scrollTo(0, 0);
  }

  onEscape() {
    return this.hideSidebar();
  }

  afterRoute(route) {
    this.hideSidebar();

    if (route === "settings") {
      this.showDocPicker();
    } else {
      this.content.style.display = "block";
    }

    if (page.canGoBack()) {
      this.back.removeAttribute("disabled");
    } else {
      this.back.setAttribute("disabled", "disabled");
    }

    if (page.canGoForward()) {
      this.forward.removeAttribute("disabled");
    } else {
      this.forward.setAttribute("disabled", "disabled");
    }
  }
};