// @ts-nocheck

/* eslint-disable */
// Mixins
import DatePickerTable from "./mixins/date-picker-table.mjs"; // Utils

import { weekNumber } from "../../util/dateTimeUtils.mjs";
import { pad, createNativeLocaleFormatter, monthChange } from "./util/index.mjs";
import { createRange } from "../../util/helpers.mjs";
import mixins from "../../util/mixins.mjs"; // Types

export default mixins(DatePickerTable
/* @vue/component */
).extend({
  name: 'v-date-picker-date-table',
  props: {
    firstDayOfWeek: {
      type: [String, Number],
      default: 0
    },
    localeFirstDayOfYear: {
      type: [String, Number],
      default: 0
    },
    showAdjacentMonths: Boolean,
    showWeek: Boolean,
    weekdayFormat: Function
  },
  computed: {
    formatter() {
      return this.format || createNativeLocaleFormatter(this.currentLocale, {
        day: 'numeric',
        timeZone: 'UTC'
      }, {
        start: 8,
        length: 2
      });
    },

    weekdayFormatter() {
      return this.weekdayFormat || createNativeLocaleFormatter(this.currentLocale, {
        weekday: 'narrow',
        timeZone: 'UTC'
      });
    },

    weekDays() {
      const first = parseInt(this.firstDayOfWeek, 10);
      return this.weekdayFormatter ? createRange(7).map(i => this.weekdayFormatter("2017-01-".concat(first + i + 15))) // 2017-01-15 is Sunday
      : createRange(7).map(i => ['S', 'M', 'T', 'W', 'T', 'F', 'S'][(i + first) % 7]);
    }

  },
  methods: {
    calculateTableDate(delta) {
      return monthChange(this.tableDate, Math.sign(delta || 1));
    },

    genTHead() {
      const days = this.weekDays.map(day => this.$createElement('th', day));

      if (this.showWeek) {
        days.unshift(this.$createElement('th'));
      }

      return this.$createElement('thead', this.genTR(days));
    },

    // Returns number of the days from the firstDayOfWeek to the first day of the current month
    weekDaysBeforeFirstDayOfTheMonth() {
      const firstDayOfTheMonth = new Date("".concat(this.displayedYear, "-").concat(pad(this.displayedMonth + 1), "-01T00:00:00+00:00"));
      const weekDay = firstDayOfTheMonth.getUTCDay();
      return (weekDay - parseInt(this.firstDayOfWeek) + 7) % 7;
    },

    getWeekNumber(dayInMonth) {
      return weekNumber(this.displayedYear, this.displayedMonth, dayInMonth, parseInt(this.firstDayOfWeek), parseInt(this.localeFirstDayOfYear));
    },

    genWeekNumber(weekNumber) {
      return this.$createElement('td', [this.$createElement('small', {
        staticClass: 'v-date-picker-table--date__week'
      }, String(weekNumber).padStart(2, '0'))]);
    },

    // eslint-disable-next-line max-statements
    genTBody() {
      const children = [];
      const daysInMonth = new Date(this.displayedYear, this.displayedMonth + 1, 0).getDate();
      let rows = [];
      let day = this.weekDaysBeforeFirstDayOfTheMonth();

      if (this.showWeek) {
        rows.push(this.genWeekNumber(this.getWeekNumber(1)));
      }

      const prevMonthYear = this.displayedMonth ? this.displayedYear : this.displayedYear - 1;
      const prevMonth = (this.displayedMonth + 11) % 12;
      const firstDayFromPreviousMonth = new Date(this.displayedYear, this.displayedMonth, 0).getDate();
      const cellsInRow = this.showWeek ? 8 : 7;

      while (day--) {
        const date = "".concat(prevMonthYear, "-").concat(pad(prevMonth + 1), "-").concat(pad(firstDayFromPreviousMonth - day));
        rows.push(this.$createElement('td', this.showAdjacentMonths ? [this.genButton(date, true, 'date', this.formatter, true)] : []));
      }

      for (day = 1; day <= daysInMonth; day++) {
        const date = "".concat(this.displayedYear, "-").concat(pad(this.displayedMonth + 1), "-").concat(pad(day));
        rows.push(this.$createElement('td', [this.genButton(date, true, 'date', this.formatter)]));

        if (rows.length % cellsInRow === 0) {
          children.push(this.genTR(rows));
          rows = [];

          if (this.showWeek && (day < daysInMonth || this.showAdjacentMonths)) {
            rows.push(this.genWeekNumber(this.getWeekNumber(day + 7)));
          }
        }
      }

      const nextMonthYear = this.displayedMonth === 11 ? this.displayedYear + 1 : this.displayedYear;
      const nextMonth = (this.displayedMonth + 1) % 12;
      let nextMonthDay = 1;

      while (rows.length < cellsInRow) {
        const date = "".concat(nextMonthYear, "-").concat(pad(nextMonth + 1), "-").concat(pad(nextMonthDay++));
        rows.push(this.$createElement('td', this.showAdjacentMonths ? [this.genButton(date, true, 'date', this.formatter, true)] : []));
      }

      if (rows.length) {
        children.push(this.genTR(rows));
      }

      return this.$createElement('tbody', children);
    },

    genTR(children) {
      return [this.$createElement('tr', children)];
    }

  },

  render() {
    return this.genTable('v-date-picker-table v-date-picker-table--date', [this.genTHead(), this.genTBody()], this.calculateTableDate);
  }

});
//# sourceMappingURL=VDatePickerDateTable.mjs.map