"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");

var _typeof = require("@babel/runtime/helpers/typeof");

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));

var _react = _interopRequireWildcard(require("react"));

var _utils = _interopRequireDefault(require("../../utils/utils"));

var _calendarBuddy = _interopRequireDefault(require("../../utils/calendarBuddy"));

var _classnames2 = _interopRequireDefault(require("classnames"));

var _TranslateHook = _interopRequireDefault(require("../../hooks/TranslateHook"));

var _i18next = _interopRequireDefault(require("i18next"));

function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }

function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }

var prefix = _utils.default.prefixCls;
var cmName = "".concat(prefix, "-calendar-china-month");

function weekIndexOfMonth(dayWeight, day) {
  var wValue = dayWeight + day;
  var n = (wValue - wValue % 7) / 7;
  n = n + (wValue % 7 > 0 ? 1 : 0);
  return n;
}

function dateEqual(p1, p2) {
  var degree = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'day';
  var r = false;

  switch (degree) {
    case 'day':
      r = p1.getDate() === p2.getDate() && p1.getFullYear() === p2.getFullYear() && p1.getMonth() === p2.getMonth();
      break;

    default:
      break;
  }

  return r;
}

function genDayOfMonth() {
  var year = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 2020;
  var month = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
  var selectedDates = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
  var t = arguments.length > 3 ? arguments[3] : undefined;
  var dayCount = new Date(year, month, 0).getDate();
  var lastDay = new Date(year, month, 0);
  var days = Array.from(Array(dayCount).keys()).map(function (v) {
    return v + 1;
  });
  var fisrtDay = new Date(year, month - 1, 1);
  var dayWeight = (fisrtDay.getDay() === 0 ? 7 : fisrtDay.getDay()) - 1;
  var weeks = Array.from(Array(weekIndexOfMonth(dayWeight, dayCount)).keys()).map(function (v) {
    return new Array(7);
  });
  days.forEach(function (v, i) {
    if (v === 1) {
      var _loop = function _loop(w) {
        var d = new Date(year, month - 1, -w);
        var wi = (d.getDay() === 0 ? 7 : d.getDay()) - 1;
        var buddyDate = (0, _calendarBuddy.default)(d.getFullYear(), d.getMonth() + 1, d.getDate(), t);
        buddyDate.selected = selectedDates.findIndex(function (sd) {
          return dateEqual(sd, buddyDate.date);
        }) !== -1;
        buddyDate.notThisMonth = true;
        weeks[0][wi] = buddyDate;
      };

      for (var w = 0; w < dayWeight; w++) {
        _loop(w);
      }
    }

    var e = (0, _calendarBuddy.default)(year, month, v, t);
    e.selected = selectedDates.findIndex(function (sd) {
      return dateEqual(sd, e.date);
    }) !== -1;
    var wni = weekIndexOfMonth(dayWeight, v) - 1;
    var wi = (e.date.getDay() === 0 ? 7 : e.date.getDay()) - 1;
    weeks[wni][wi] = e;

    if (v === dayCount) {
      var lastDayWeekDay = lastDay.getDay() === 0 ? 7 : lastDay.getDay();

      var _loop2 = function _loop2(_w) {
        var d = new Date(year, month - 1, dayCount + _w);
        var wi = (d.getDay() === 0 ? 7 : d.getDay()) - 1;
        var we = (0, _calendarBuddy.default)(d.getFullYear(), d.getMonth() + 1, d.getDate(), t);
        we.selected = selectedDates.findIndex(function (sd) {
          return dateEqual(sd, we.date);
        }) !== -1;
        we.notThisMonth = true;
        weeks[wni][wi] = we;
      };

      for (var _w = 1; _w <= 7 - lastDayWeekDay; _w++) {
        _loop2(_w);
      }
    }
  });
  return weeks;
}

function MonthCell(props) {
  var t = (0, _TranslateHook.default)('MK_MonthCell');
  var year = props.year,
      month = props.month,
      _props$selectedDates = props.selectedDates,
      selectedDates = _props$selectedDates === void 0 ? [] : _props$selectedDates,
      onChange = props.onChange;
  var weeks = (0, _react.useMemo)(function () {
    return genDayOfMonth(year, month, selectedDates, t);
  }, [year, month, selectedDates, t]);

  var onDayClick = function onDayClick(d) {
    if (typeof onChange === 'function') {
      onChange(d);
    }
  };

  return /*#__PURE__*/_react.default.createElement("div", {
    className: cmName
  }, /*#__PURE__*/_react.default.createElement("ul", {
    className: "".concat(cmName, "_week")
  }, /*#__PURE__*/_react.default.createElement("li", null, t('Monday')), /*#__PURE__*/_react.default.createElement("li", null, t('Tuesday')), /*#__PURE__*/_react.default.createElement("li", null, t('Wednesday')), /*#__PURE__*/_react.default.createElement("li", null, t('Thursday')), /*#__PURE__*/_react.default.createElement("li", null, t('Friday')), /*#__PURE__*/_react.default.createElement("li", null, t('Saturday')), /*#__PURE__*/_react.default.createElement("li", null, t('Sunday'))), /*#__PURE__*/_react.default.createElement("div", {
    className: "".concat(cmName, "_date")
  }, weeks.map(function (w, idx) {
    return /*#__PURE__*/_react.default.createElement("ul", {
      className: 'date-line',
      key: idx
    }, w.map(function (d) {
      var lunarDate = d.lunarDate,
          festivals = d.festivals,
          isHoliday = d.isHoliday,
          isOccuyByHoliday = d.isOccuyByHoliday,
          date = d.date;
      var dayClz = (0, _classnames2.default)("".concat(cmName, "_date-day"), (0, _defineProperty2.default)({
        holiday: !d.notThisMonth && isHoliday && _i18next.default.language !== 'en'
      }, "".concat(cmName, "_date-day_selected"), !d.notThisMonth && d.selected));
      var secondClz = (0, _classnames2.default)('lunar-cell', {
        'festival': festivals && festivals.length > 0
      });
      var dayMarkerClz = (0, _classnames2.default)('day-marker', {
        'work': isOccuyByHoliday
      });
      return /*#__PURE__*/_react.default.createElement("li", {
        className: dayClz,
        onClick: function onClick() {
          onDayClick(date);
        }
      }, d.notThisMonth ? null : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("span", {
        className: "solar-cell"
      }, date.getDate()), /*#__PURE__*/_react.default.createElement("span", {
        className: secondClz
      }, festivals && festivals.length > 0 ? festivals[0] : lunarDate.day), isHoliday || isOccuyByHoliday ? /*#__PURE__*/_react.default.createElement("span", {
        className: _i18next.default.language === 'en' ? null : dayMarkerClz
      }, isHoliday ? t('休') : isOccuyByHoliday ? t('班') : null) : null));
    }));
  })));
}

var _default = MonthCell;
exports.default = _default;