<script>
import CLodop from '@/libs/print/CLodop';
import {getDevice} from '@/tools/print.tool';
import {template72} from '@/components/print/template';
import {selectOrderDetail, selectOrderDetail2} from '@/api/prescription/prescriptionAudit';
import {bignumber, chain, multiply} from 'mathjs';

export default {
  name: 'print_ticket_72',
  props: {
    id: {type: [String, Number], required: true},
  },
  data() {
    return {
      loaded: false,
      preview: false,
      total: 1,

      tag: `print-preview_${Date.now()}`,
      paper: '药品明细',

      model: null,
      device: null,
      printing: false,
    };
  },
  computed: {
    loading() {
      return !this.loaded || !this.preview;
    },
  },
  mounted() {
    // this.print(true);
  },
  methods: {
    async print(preview = false) {
      const instance = await CLodop();
      const model = await this.getModel();

      template72.call(instance, model, `${this.paper}`);

      this.device = await getDevice(`paper:${this.paper}`);
      if (this.device) instance['SET_PRINT_PAGESIZE'](3, 0, 0, this.paper);
      else {
        this.device = await getDevice(`name:GP-C80180 Series`);
        instance['SET_PRINT_PAGESIZE'](3, '72mm', 0, 'CreateCustomPage');
      }
      if (this.device) instance['SET_PRINTER_INDEX'](this.device.index);

      instance['SET_PRINT_COPIES'](this.total);

      if (preview) {
        instance['SET_PREVIEW_WINDOW'](1, 1, 1, 0, 0, `${this.paper}.开始打印`);
        instance['SET_SHOW_MODE']('PREVIEW_IN_BROWSE', true);
        instance['SET_PRINT_MODE']('AUTO_CLOSE_PREWINDOW', true);
        instance['PREVIEW'](this.tag);
      } else if (this.device) {
        if (instance['PRINT']()) this.complete();
        else this.$message.warning(`请检查打印机 (${this.device.name})`);
      } else {
        if (instance['PRINTA']()) this.complete();
        else this.$message.warning(`请检查打印机`);
      }
      this.printing = false;
      this.loaded = true;
    },
    delay() {
      setTimeout(() => {this.preview = true;}, 500);
    },
    complete() {
      this.$message.success(`开始打印`);
      this.$emit('close', true);
    },

    async getModel() {
      if (this.model) return this.model;
      this.model = await selectOrderDetail2({id: this.id});

      const count = bignumber(this.model.recipe.count || 0);
      let unitWeight = chain(bignumber(0));
      for (const medicine of this.model.recipe.medicines) {
        unitWeight = unitWeight.add(bignumber(medicine.dosage));
      }
      this.model.recipe.unitWeight = +unitWeight.valueOf().toFixed(2);
      this.model.recipe.totalWeight = +unitWeight.multiply(count).valueOf().toFixed(2);

      return this.model;
    },
  },
};
</script>

<template>
  <div class="print-preview" v-loading="loading">
    <div class="top" :style="{backgroundColor: preview ? '#f0f0f0' : 'transparent'}"></div>
    <iframe :id="tag" @load="delay"></iframe>
    <div style="display: flex; align-items: center; justify-content: space-evenly;">
      <el-button style="width: 100%;" type="primary" :loading="printing" @click="printing = true;print()">打印
      </el-button>
    </div>
  </div>
</template>

<style scoped lang="scss">
.print-preview {
  margin: auto;
  width: 360px;
  display: flex;
  flex-direction: column;

  .top {
    height: 40px;
  }

  iframe {
    border: none;
    width: 100%;
    flex: auto;
  }

  > div {
    flex: none;
  }
}
</style>
