<template>
  <q-toolbar
    class="shadow-2 text-accent bg-secondary q-pa-none"
    style="flex-wrap: wrap"
  >
    <q-btn
      class="col-auto"
      :disable="!$store.state.power_state"
      stretch
      stack
      flat
      no-caps
      icon="img:pad/toolbar/close_icon.png"
      :label="$t('close')"
      @click="closeCurrentWindow"
    />

    <q-btn
      class="col-auto"
      :disable="!$store.state.power_state"
      stretch
      stack
      flat
      no-caps
      icon="img:pad/toolbar/clean_windows_icon.png"
      :label="$t('clean screen')"
      @click="closeAllWindows"
    />

    <q-btn
      class="col-auto"
      :disable="!$store.state.power_state"
      stretch
      stack
      flat
      no-caps
      icon="img:pad/toolbar/full_screen_icon.png"
      :label="$t('full screen window')"
      @click="fullscreenWindow"
    />

    <q-btn
      class="col-auto"
      :disable="!$store.state.power_state"
      stretch
      stack
      flat
      no-caps
      icon="img:pad/toolbar/exit_full_screen_icon.png"
      :label="$t('restore window size')"
      @click="exitFullscreenWindow"
    />

    <q-btn
      class="col-auto"
      :disable="!$store.state.power_state"
      stretch
      stack
      flat
      no-caps
      icon="img:pad/toolbar/top_window_icon.png"
      :label="$t('win top')"
      @click="topWindow"
    />
    <q-btn
      class="col-auto"
      :disable="!$store.state.power_state"
      stretch
      stack
      flat
      no-caps
      icon="img:pad/toolbar/lower_window_icon.png"
      :label="$t('win lower')"
      @click="lowerWindow"
    />

    <q-btn
      v-if="function_center_control"
      :disable="!$store.state.power_state"
      class="col-auto"
      stretch
      stack
      flat
      no-caps
      icon="img:pad/toolbar/center_control_icon.png"
      :label="$t('center control')"
      @click="$refs.center_control_dialog.showDialog()"
    />
    <q-btn
      class="col-auto"
      stretch
      stack
      flat
      no-caps
      :disable="power_flag"
      icon="img:pad/toolbar/power_on_icon.png"
      :label="$t('power on')"
      @click="powerOn"
    />
    <q-btn
      class="col-auto"
      stretch
      stack
      flat
      no-caps
      :disable="power_flag"
      icon="img:pad/toolbar/power_off_icon.png"
      :label="$t('power off')"
      @click="powerOff"
    />
    <q-btn
      stretch
      :disable="!$store.state.power_state"
      flat
      stack
      no-caps
      icon="img:pad/toolbar/stop_plan.png"
      :label="$t('stop plan')"
      class="col-auto"
      v-if="plan_running"
      @click="stopPlan"
    />
    <q-btn
      stretch
      :disable="!$store.state.power_state"
      flat
      stack
      no-caps
      icon="img:pad/toolbar/subtitle.png"
      :label="$t('subtitle')"
      class="col-auto"
      @click="$refs.subtitle_dialog.showDialog()"
    />

    <q-btn
      stretch
      :disable="!$store.state.power_state"
      flat
      stack
      no-caps
      icon="img:pad/toolbar/edit_window_rect.png"
      :label="$t('toolbar edit window rect')"
      class="col-auto"
      @click="editRect"
    />

    <q-btn
      class="col-auto"
      :disable="!$store.state.power_state"
      stretch
      stack
      flat
      no-caps
      icon="img:pad/toolbar/other_setting.png"
      :label="$t('other setting')"
    >
      <q-popup-proxy>
        <q-list class="shadow-2 text-primary">
          <q-item
            clickable
            v-close-popup
            @click="$refs.system_setting_dialog.showDialog()"
          >
            <q-item-section avatar>
              <q-icon name="img:pad/toolbar/system_setting.png" />
            </q-item-section>
            <q-item-section>
              {{ $t("system setting") }}
            </q-item-section>
          </q-item>
          <q-item
            clickable
            v-close-popup
            @click="$refs.file_manage_dialog.showDialogAsync()"
          >
            <q-item-section avatar>
              <q-icon name="img:pad/toolbar/file_upload_icon.png" />
            </q-item-section>
            <q-item-section>
              {{ $t("file manage") }}
            </q-item-section>
          </q-item>
          <q-item
            clickable
            v-close-popup
            @click="$refs.background_image_dialog.showDialog()"
          >
            <q-item-section avatar>
              <q-icon name="img:pad/toolbar/wallpaper_icon.png" />
            </q-item-section>
            <q-item-section>
              {{ $t("background image setting") }}
            </q-item-section>
          </q-item>
          <q-item
            v-if="$store.state.advanced_debug"
            clickable
            v-close-popup
            @click="$refs.advanced_debug_dialog.showDialog()"
          >
            <q-item-section avatar>
              <q-icon name="bug_report" color="accent" />
            </q-item-section>
            <q-item-section> AdvancedDebug </q-item-section>
          </q-item>
        </q-list>
      </q-popup-proxy>
    </q-btn>
    <q-space />
    <q-btn
      class="col-1"
      stretch
      stack
      flat
      no-caps
      icon="img:pad/toolbar/logout_icon.png"
      :label="$t('logout')"
      @click="logout"
    />
  </q-toolbar>

  <background-image-dialog ref="background_image_dialog" />
  <file-manage-dialog ref="file_manage_dialog" />
  <center-control-dialog ref="center_control_dialog" />
  <subtitle-dialog ref="subtitle_dialog" />
  <advanced-debug-dialog ref="advanced_debug_dialog" />
  <window-rect-edit-dialog ref="window_rect_edit_dialog" />
  <system-setting-dialog ref="system_setting_dialog" />
</template>

<script lang="ts">
import { defineComponent, Ref, ref, computed, watch } from "vue";
import { Cookies, SessionStorage, useQuasar } from "quasar";
import { useI18n } from "vue-i18n";
import { useStore } from "src/store";
import BackgroundImageDialog from "src/components/BackgroundImageDialog.vue";
import FileManageDialog from "src/components/FileManageDialog.vue";
import SubtitleDialog from "src/components/SubtitleDialog.vue";
import CenterControlDialog from "src/components/CenterControlDialog.vue";
import AdvancedDebugDialog from "src/components/AdvancedDebugDialog.vue";
import WindowRectEditDialog from "src/components/WindowRectEditDialog.vue";
import SystemSettingDialog from "src/components/SystemSettingDialog.vue";

import GlobalData from "src/common/GlobalData";
import { EDeviceAttribute } from "src/entities/EDeviceAttribute";

export default defineComponent({
  name: "PadCustomISVTopToolbarPage",
  components: {
    BackgroundImageDialog,
    FileManageDialog,
    CenterControlDialog,
    SubtitleDialog,
    AdvancedDebugDialog,
    WindowRectEditDialog,
    SystemSettingDialog,
  },
  setup() {
    const $store = useStore();
    const $q = useQuasar();
    const $t = useI18n();

    const window_rect_edit_dialog: Ref<any> = ref(null);

    const plan_running = computed(
      () => $store.state.current_running_plan.trim() != ""
    );

    const function_center_control = ref(
      ($store.state.device_attribute & EDeviceAttribute.CenterControl) != 0
    );

    watch(
      () => $store.state.device_attribute,
      (value) => {
        function_center_control.value =
          (value & EDeviceAttribute.CenterControl) != 0;
      }
    );

    const power_flag = ref(false);
    watch(
      () => power_flag.value,
      (newV) => {
        if (newV) {
          setTimeout(() => {
            power_flag.value = false;
          }, 1100 * 5);
        }
      }
    );

    return {
      plan_running,
      function_center_control,
      window_rect_edit_dialog,
      power_flag,

      toogleFullScreen() {
        if (!$q.fullscreen.isCapable) {
          if ($q.platform.is.ipad) {
            $q.notify({
              type: "warning",
              message:
                $t.t("on the iPad, only Safari supports full screen") + "!",
              position: "top",
              timeout: 1500,
            });
          } else {
            $q.notify({
              type: "warning",
              message:
                $t.t("the current browser does not support full screen") + "!",
              position: "top",
              timeout: 1500,
            });
          }
          return;
        }
        if ($q.fullscreen.isActive) {
          $q.fullscreen.exit();
        } else {
          $q.fullscreen.request().catch((e: any) => {
            console.log(e);
          });
        }
      },
      stopPlan() {
        GlobalData.getInstance().getCurrentClient()?.stopCurrentRunningPlan();
      },
      topWindow() {
        const window = $store.state.windows.find(
          (element) => element && element.uuid == $store.state.selected_window
        );
        if (window) {
          GlobalData.getInstance()
            .getCurrentClient()
            ?.focusIn(window.window_id);
        }
      },
      lowerWindow() {
        const window = $store.state.windows.find(
          (element) => element && element.uuid == $store.state.selected_window
        );
        if (window) {
          GlobalData.getInstance()
            .getCurrentClient()
            ?.lowerWindow(window.window_id);
        }
      },
      fullscreenWindow() {
        const window = $store.state.windows.find(
          (element) => element && element.uuid == $store.state.selected_window
        );
        if (window) {
          GlobalData.getInstance()
            .getCurrentClient()
            ?.windowFullScreen(window.window_id, true);
        }
      },
      exitFullscreenWindow() {
        const window = $store.state.windows.find(
          (element) => element && element.uuid == $store.state.selected_window
        );
        if (window) {
          GlobalData.getInstance()
            .getCurrentClient()
            ?.windowFullScreen(window.window_id, false);
        }
      },
      closeCurrentWindow() {
        const window = $store.state.windows.find(
          (element) => element && element.uuid == $store.state.selected_window
        );
        if (window) {
          GlobalData.getInstance()
            .getCurrentClient()
            ?.closeWindow(window.window_id);
        }
      },
      closeAllWindows() {
        GlobalData.getInstance().getCurrentClient()?.closeWindow(-1);
      },
      switchLanguage() {
        let language = Cookies.get("language");
        if (!language) {
          language = "zh-CN";
        }

        if (language != "zh-CN" && language != "en-US") {
          language = "zh-CN";
        } else {
          language = language == "zh-CN" ? "en-US" : "zh-CN";
        }
        Cookies.set("language", language, {
          expires: 365,
        });
        window.location.reload();
      },
      logout() {
        const w = window as any;
        if (w.controlLogout && typeof w.controlLogout == "function") {
          w.controlLogout();
        } else {
          Cookies.remove("auto_login");
          SessionStorage.clear();
          try {
            $q.fullscreen.exit();
          } catch {}
          window.location.reload();
        }
      },
      async powerOff() {
        let success = false;
        try {
          const response = await GlobalData.getInstance()
            .getCurrentClient()
            ?.deviceStandByMode();
          if (response) {
            success = response?.success ?? false;
          }
        } catch {}
        if (success) {
          power_flag.value = true;
        }
        $q.notify({
          color: success ? "positive" : "negative",
          icon: success ? "done" : "warning",
          message:
            $t.t("send power off command") +
            (success ? $t.t("success") : $t.t("fail")) +
            "!",
          position: "top",
          timeout: 1500,
        });
      },
      async powerOn() {
        let success = false;
        try {
          const response = await GlobalData.getInstance()
            .getCurrentClient()
            ?.wakeUpDevice();
          if (response) {
            success = response?.success ?? false;
          }
        } catch {}
        if (success) {
          power_flag.value = true;
        }
        $q.notify({
          color: success ? "positive" : "negative",
          icon: success ? "done" : "warning",
          message:
            $t.t("send power on command") +
            (success ? $t.t("success") : $t.t("fail")) +
            "!",
          position: "top",
          timeout: 1500,
        });
      },
      async editRect() {
        if (window_rect_edit_dialog.value) {
          try {
            const window = $store.state.windows.find(
              (element) =>
                element && element.uuid == $store.state.selected_window
            );
            if (window) {
              window_rect_edit_dialog.value.showDialog(window.window_id);
            }
          } catch {}
        }
      },
    };
  },
});
</script>
