<template>
  <div class="container mt-4">
    <div class="row mb-3 align-items-end g-2">
      <div class="col">
        <label class="form-label">Район</label>
        <select v-model.number="selectedDistrictId" class="form-select">
          <option :value="null">— Вся область —</option>
          <option v-for="d in districtsList" :key="d.id" :value="d.id">
            {{ d.name }}
          </option>
        </select>
      </div>
      <div class="col">
        <label class="form-label">Заявка</label>
        <select v-model.number="selectedRequestId" class="form-select">
          <option :value="null">— выберите заявку —</option>
          <option v-for="r in requestsList" :key="r.id" :value="r.id">
            {{ r.name || r.number }}
          </option>
        </select>
      </div>
      <div class="col">
        <label class="form-label">Дата письма</label>
        <input
            type="date"
            class="form-control"
            v-model="selectedDocDate"
        />
      </div>
      <div class="col d-flex align-items-end">
        <button
            class="btn btn-primary w-100"
            :disabled="!selectedRequestId || loading"
            @click="generatePdf"
        >
          {{ loading ? 'Генерация…' : 'Скачать PDF' }}
        </button>
      </div>
    </div>
  </div>
</template>

<script setup>
import {computed, ref, watch} from 'vue';
import jsPDF from 'jspdf';
import autoTable from 'jspdf-autotable';
import dejavuFont from '@/fonts/DejaVuSans-normal.js';
import {useAuthStore} from '@/stores/Auth.js';
import signaturePng from '@/assets/signature.png';
import stampPng from '@/assets/stamp.png';
import logo from '@/assets/logo.png';


const authStore = useAuthStore();
const districtsList = ref([]);
const requestsList = ref([]);
const selectedDistrictId = ref(null);
const selectedRequestId = ref(null);
const loading = ref(false);
const selectedDocDate = ref(null);
const dateRange = ref({date_start: null, date_end: null});
const districtRanges = ref([]);

watch(selectedRequestId, async (val) => {
  dateRange.value = {date_start: null, date_end: null}; // сбрасываем
  if (val) {
    const {response, error} = await authStore.fetchRequestDateRange(val);
    if (response && response.data) {
      dateRange.value = response.data;
    }
  }

  districtRanges.value = []; // сброс
  if (val) {
    // запрашиваем общий диапазон (уже есть)
    const {response, error} = await authStore.fetchRequestDateRange(val);
    if (response && response.data) dateRange.value = response.data;

    // запрашиваем диапазоны по районам
    const {response: resp2} = await authStore.fetchRequestDistrictRanges(val);
    if (resp2 && Array.isArray(resp2.data)) districtRanges.value = resp2.data;
  }
});

const dateStartStr = computed(() =>
    dateRange.value.date_start
        ? new Date(dateRange.value.date_start).toLocaleDateString('ru-RU')
        : '__.__.____'
);
const dateEndStr = computed(() =>
    dateRange.value.date_end
        ? new Date(dateRange.value.date_end).toLocaleDateString('ru-RU')
        : '__.__.____'
);

//Генерация номера документа
function getDocNumberByDate(dateStr) {
  if (!dateStr) return '';
  const d = new Date(dateStr);
  // День без ведущего нуля
  const day = d.getDate();
  // Месяц с ведущим нулём (но одна цифра, если с 10 по 12 — двузначно)
  const month = String(d.getMonth() + 1).padStart(2, '0');
  // Последние две цифры года
  const year = String(d.getFullYear()).slice(-2);
  return `${day}${month}/${year}-1`;
}

// загрузим справочники
async function loadRefs() {
  try {
    const {response: distRes} = await authStore.getRefDistricts();
    districtsList.value = distRes.data.map(d => ({id: d.id, name: d.name.trim()}));
    const {response: reqRes} = await authStore.getRequests();
    requestsList.value = reqRes.data;
  } catch (e) {
    console.error(e);
  }
}

loadRefs();

const pdfFileName = computed(() => {
  const reqObj = requestsList.value.find(r => r.id === selectedRequestId.value) || {};
  const requestName = reqObj.name || reqObj.number || `Заявка_${selectedRequestId.value}`;
  const districtName = selectedDistrictId.value
      ? (districtsList.value.find(d => d.id === selectedDistrictId.value)?.name || 'Район')
      : 'Оренбургская область';
  const dateStr = new Date().toISOString().slice(0, 10);

  // Убрать лишние пробелы и недопустимые символы для имени файла
  const safe = s => (s || '').replace(/[<>:"/\\|?*]/g, '').replace(/\s+/g, '_');
  return `ИнформПисьмо${safe(requestName)}_${safe(districtName)}_${dateStr}.pdf`;
});

async function generatePdf() {
  if (!selectedRequestId.value) {
    alert('Выберите заявку');
    return;
  }
  loading.value = true;

  const doc = new jsPDF({unit: 'mm', format: 'a4'});
  doc.addFileToVFS('DejaVuSans.ttf', dejavuFont);
  doc.addFont('DejaVuSans.ttf', 'DejaVuSans', 'normal');
  doc.setFont('DejaVuSans');
  doc.setFontSize(11);

  const marginLeft = 20;
  let y = 18;
  // Изображение логотипа
  doc.addImage(logo, 'PNG', marginLeft, y, 67, 25);
  // Шапка организации
  doc.setFontSize(8);
  y += 25;
  doc.text('Общество с ограниченной ответственностью', marginLeft, y);
  y += 5;
  doc.text('«Интеллектуальные технологии безопасности»', marginLeft, y);
  y += 5;
  doc.text('ОГРН 5167746302928, ИНН 9701054177', marginLeft, y);
  y += 5;
  doc.text('111524, г. Москва, ул. Электродная, дом 2, \n' +
      'стр. 16, этаж 2, помещение I', marginLeft, y);

  // Адресат и дата справа
  y -= 30;

  doc.setFontSize(11);
  doc.text('Руководителям районных филиалов', marginLeft + 77, y);
  y += 7;
  doc.text('АО “Оренбургремдорстрой”', marginLeft + 77, y);

  // Дата и номер документа
  y += 35;
  const docDateStr = selectedDocDate.value || new Date().toISOString().slice(0, 10); // если вдруг не выбрано
  let num = getDocNumberByDate(docDateStr);

  let ruDate = new Date(docDateStr).toLocaleDateString('ru-RU');
  doc.text(`от ${ruDate} года №${num}`, marginLeft, y);

  // Основной текст
  y += 15;
  doc.setFontSize(12);

  const districtName = selectedDistrictId.value
      ? (districtsList.value.find(d => d.id === selectedDistrictId.value)?.name || 'Район')
      : 'Оренбургская область';

  const bodyText =
      `    Во исполнение договора № 20-13/8с-КСМП от 14.04.2025, информируем вас о порядке проведения работ по учету интенсивности дорожного движения в вашем районе ` +
      `с ${dateStartStr.value} по ${dateEndStr.value}, время работ с 08:00 до 18:00.`;

  doc.text(doc.splitTextToSize(bodyText, 170), marginLeft, y);

  y += 20; // отступ после текста

// Таблица: готовим массив строк
  const tableRows = districtRanges.value.map((row, idx) => [
    (idx + 1).toString(),
    row.district_name,
    (row.date_start ? new Date(row.date_start).toLocaleDateString('ru-RU') : '__.__.____') +
    ' по ' +
    (row.date_end ? new Date(row.date_end).toLocaleDateString('ru-RU') : '__.__.____'),
  ]);

  if (tableRows.length > 0) {
    // Заголовки
    doc.setFontSize(10);
    autoTable(doc, {
      startY: y,
      head: [['№', 'Район', 'Даты работ']],
      body: tableRows,
      margin: {left: marginLeft},
      styles: {
        font: 'DejaVuSans',
        fontStyle: 'normal',
        fontSize: 8,
        lineWidth: 0.1,
        lineColor: [0, 0, 0]
      },
      headStyles: {
        font: 'DejaVuSans',
        fontStyle: 'normal',
        halign: 'center',
        fontSize: 8,
        textColor: [0, 0, 0],
        fillColor: [255, 255, 255],
        lineWidth: 0.1,
        lineColor: [0, 0, 0]
      },
      theme: 'grid',
    });
    y = doc.lastAutoTable.finalY + 10;
  } else {
    y += 10;
  }
  // Координаты для подписи и печати
  const sigWidthMm = 40;
  const sigHeightMm = 20;
  const stampW = 35;
  const stampH = 35;
  const pageW = doc.internal.pageSize.getWidth();
  const pageH = doc.internal.pageSize.getHeight();
  const sigX = pageW - marginLeft - sigWidthMm;
  const sigY = pageH - 55; // ~55 мм от низа, чтобы всё уместилось красиво

  // Левая подпись — должность
  doc.setFontSize(12);
  doc.text('Генеральный директор', marginLeft, sigY + 15);

  // Правая подпись — имя
  doc.text('Д.А. Иванов', sigX, sigY + 15);

  // Изображение подписи
  doc.addImage(signaturePng, 'PNG', sigX-60, sigY, sigWidthMm, sigHeightMm);

  // Печать — наложить поверх подписи с небольшим смещением вверх-влево
  const stampX = sigX + 8- 45;
  const stampY = sigY - 10;
  doc.addImage(stampPng, 'PNG', stampX, stampY, stampW, stampH);

  doc.save(pdfFileName.value);
  loading.value = false;
}
</script>

<style scoped>
.form-select {
  margin-top: 0.25rem;
}
</style>
