<template>
  <q-dialog
    persistent
    v-model="show_dialog"
    @before-hide="resetData"
    @keydown="
      (evt) => {
        if (!loading && evt.keyCode == 27) {
          show_dialog = false;
        }
      }
    "
  >
    <q-card class="overflow-hidden" style="max-width: 60vw">
      <q-form @submit="onSubmit">
        <q-card-section class="q-ma-none q-pa-sm">
          <div class="row">
            <div class="col-auto text-h6">
              {{ dialog_status == 0 ? $t("add") : $t("edit")
              }}{{ $t("button") }}
            </div>
            <q-space />
            <div>
              <q-btn
                :loading="loading"
                :disable="loading"
                flat
                round
                icon="close"
                color="red"
                v-close-popup
              >
                <q-tooltip>
                  {{ $t("close") }}
                </q-tooltip>
              </q-btn>
            </div>
          </div>
        </q-card-section>

        <q-separator />

        <q-card-section class="scroll" style="width: 60vw; height: 50vh">
          <q-list>
            <q-item>
              <q-item-section avatar class="header_label">
                {{ $t("name") }}
              </q-item-section>
              <q-item-section>
                <q-input
                  v-model="button_name"
                  :loading="loading"
                  :disable="loading"
                  lazy-rules
                  :rules="[
                    (val) =>
                      (val && val.toString().length > 0) ||
                      $t('Please type something'),
                  ]"
                />
              </q-item-section>
            </q-item>
            <q-item>
              <q-item-section avatar class="header_label">
                {{ $t("command") }}
              </q-item-section>
              <q-item-section>
                <q-input
                  v-model="button_command"
                  type="textarea"
                  :loading="loading"
                  :disable="loading"
                  :rules="[
                    (val) =>
                      isHexStr(val) ||
                      $t('Please input vaild hex str') +
                        ' \t' +
                        $t('example') +
                        ': 0x00 0x01 0x02 0x03',
                  ]"
                  :hint="$t('example') + ': 0x00 0x01 0x02 0x03'"
                />
              </q-item-section>
            </q-item>
            <q-item v-if="false">
              <q-item-section avatar class="header_label">
                {{ $t("icon") }}
              </q-item-section>
              <q-item-section>
                <q-input
                  v-model="button_icon"
                  :loading="loading"
                  :disable="loading"
                />
              </q-item-section>
            </q-item>
          </q-list>
        </q-card-section>
        <q-card-actions align="right">
          <q-btn
            ref="cancel"
            flat
            :label="$t('Cancel')"
            no-caps
            :loading="loading"
            v-close-popup
            color="primary"
          />

          <q-btn
            ref="accept"
            flat
            :label="$t('Accept')"
            no-caps
            :loading="loading"
            type="submit"
            color="primary"
          />
        </q-card-actions>
      </q-form>
    </q-card>
  </q-dialog>
</template>

<style scoped>
.header_label {
  width: 10%;
}
.header_label_2 {
  width: 10%;
  align-items: center;
}
</style>

<script lang="ts">
import { defineComponent, ref } from "vue";
import { useStore } from "src/store";
import { useQuasar, copyToClipboard } from "quasar";
import { useI18n } from "vue-i18n";

import { ExternalControlTableEntity } from "src/entities/ExternalControlTableEntity";

export default defineComponent({
  name: "ComponentCenterControlButtonDialog",
  components: {},
  setup() {
    let $store = useStore();
    let $q = useQuasar();
    let $t = useI18n();

    let show_dialog = ref(false);
    let loading = ref(false);

    const button_name = ref("");
    const button_command = ref("");
    const button_icon = ref("");
    const dialog_status = ref(0); // 0: add 1: edit

    let _reject: any = null;
    let _resolve: any = null;

    return {
      show_dialog,
      loading,
      button_name,
      dialog_status,
      button_command,
      button_icon,
      copyToClipboard,
      loga(a: any) {
        console.log(a);
      },
      async showDialogAsync(in_data?: ExternalControlTableEntity) {
        if (_resolve) {
          _resolve(null);
        } else if (_reject) {
          _reject(null);
        }
        return new Promise((resolve, reject) => {
          _reject = reject;
          _resolve = resolve;
          if (in_data) {
            dialog_status.value = 1;
            button_name.value =
              in_data.name ?? $t.t("new button") + (in_data.number ?? 1);
            const temp_command = in_data.command ?? "";
            button_icon.value = "";

            let target_show_command = "";
            for (const item of temp_command) {
              try {
                let temp_str = item.toString(16).toUpperCase();
                if (temp_str.length == 1) {
                  temp_str = "0" + temp_str;
                }
                target_show_command += "0x" + temp_str + " ";
              } catch {}
            }
            button_command.value = target_show_command;
          } else {
            dialog_status.value = 0;
            button_name.value = $t.t("new button") + "1";
            button_command.value = "";
            button_icon.value = "";
          }

          show_dialog.value = true;
        });
      },
      resetData() {
        loading.value = false;
        dialog_status.value = 0;
        button_name.value = "";
        button_command.value = "";
        button_icon.value = "";
        if (_resolve) {
          _resolve(null);
        } else if (_reject) {
          _reject(null);
        }
        _reject = null;
        _resolve = null;
      },
      onSubmit() {
        const command = [];
        for (const item of button_command.value.trim().split(" ")) {
          try {
            const v = parseInt(item);
            if (!isNaN(v)) {
              command.push(v);
            }
          } catch {}
        }

        const data = {
          name: button_name.value,
          command,
          icon: button_icon.value,
        };

        if (_resolve) {
          _resolve(data);
        } else if (_reject) {
          _reject(data);
        }
        show_dialog.value = false;
      },
      isHexStr(val: string) {
        if (val != null && val != undefined && typeof val == "string") {
          val = val.trim();
          if (val.length == 0) {
            return true;
          }
          for (const item of val.split(" ")) {
            if (item.length > 4) {
              return false;
            }
            if (!/^0[xX][A-Fa-f0-9]{1,2}/.test(item)) {
              return false;
            }
          }
          return true;
        }
        return false;
      },
    };
  },
});
</script>