"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
    if (mod && mod.__esModule) return mod;
    var result = {};
    if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    __setModuleDefault(result, mod);
    return result;
};
var __rest = (this && this.__rest) || function (s, e) {
    var t = {};
    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
        t[p] = s[p];
    if (s != null && typeof Object.getOwnPropertySymbols === "function")
        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
                t[p[i]] = s[p[i]];
        }
    return t;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DatePicker = void 0;
const react_1 = __importStar(require("react"));
const react_datepicker_1 = __importDefault(require("react-datepicker"));
const styled_components_1 = __importDefault(require("styled-components"));
const react_text_mask_1 = __importDefault(require("react-text-mask"));
const createAutoCorrectedDatePipe_1 = __importDefault(require("text-mask-addons/dist/createAutoCorrectedDatePipe"));
const datepicker_styles_1 = __importDefault(require("../../utils/datepicker.styles"));
const icon_1 = require("../../atoms/icon");
const box_1 = require("../../atoms/box/box");
const css_class_1 = require("../../utils/css-class");
const DatePickerIcon = styled_components_1.default(icon_1.Icon) `
  position: absolute;
  background: ${({ theme }) => theme.colors.primary100};
  color: ${({ theme }) => theme.colors.white};
  right: 0;
  top: 0;
  display: flex;
  justify-content: center;
  align-items: center;
  overflow: hidden;
  height: 100%;
  min-width: 34px;
  width: auto;
`;
const StyledDatePicker = styled_components_1.default(box_1.Box) `
  ${datepicker_styles_1.default};
  position: relative;
  & .react-datepicker-wrapper {
    width: 100%;
    box-sizing: border-box;
    border: ${({ theme }) => `1px solid ${theme.colors.grey40}`};
    padding: 4px 8px;
    font-size: 14px;
    line-height: 24px;
  }
  & .react-datepicker-wrapper input {
    border: none;
    width: 100%;
    height: 100%;
    background: transparent;
    color: ${({ theme }) => theme.colors.grey80};
    &:focus-visible {
      outline: none;
    }
  }
  & .react-datepicker {
    border-radius: 0;
    padding: ${({ theme }) => theme.space.default};
    font-family: ${({ theme }) => theme.font};
    z-index: 101;
    &:focus-visible {
      outline: none;
    }
  }
  & .react-datepicker__navigation--next {
    border-left-color: ${({ theme }) => theme.colors.primary60};
    top: 16px;
  }
  & .react-datepicker__navigation--next:hover {
    border-left-color: ${({ theme }) => theme.colors.primary100};
  }
  & .react-datepicker__navigation--previous {
    border-right-color: ${({ theme }) => theme.colors.primary60};
    top: 16px;
  }
  & .react-datepicker__navigation--previous:hover {
    border-right-color: ${({ theme }) => theme.colors.primary100};
  }
  & .react-datepicker__navigation {
    outline: none;
  }
  & .react-datepicker__year-read-view--down-arrow {
    top: 5px;
  }
  & .react-datepicker__header {
    background: ${({ theme }) => theme.colors.white};
    font-size: ${({ theme }) => theme.fontSizes.default};
    border: none;
  }
  & .react-datepicker__current-month {
    font-weight: normal;
    padding-bottom: ${({ theme }) => theme.space.lg};
  }
  & .react-datepicker__month {
    margin-top: 0;
  }
  & .react-datepicker__day-name {
    color: ${({ theme }) => theme.colors.primary60};
  }
  & .react-datepicker__day--outside-month {
    color: ${({ theme }) => theme.colors.grey40};
  }
  & .react-datepicker__day--today.react-datepicker__day--keyboard-selected {
    color: ${({ theme }) => theme.colors.white};
  }
  & .react-datepicker__day--selected {
    color: ${({ theme }) => theme.colors.white};
  }
  & .react-datepicker__day--keyboard-selected:not(.react-datepicker__day--today) {
    background: none;
    color: ${({ theme }) => theme.colors.grey100};
  }
  & .react-datepicker__day:hover,
  & .react-datepicker__day {
    border-radius: 15px;
  }
  & .react-datepicker__day--selected {
    background: ${({ theme }) => theme.colors.primary100};
    border-radius: 15px;
    color: ${({ theme }) => theme.colors.white};
  }
`;
const parseDateSafely = (newDate) => {
    const timestamp = Date.parse(newDate);
    if (!Number.isNaN(timestamp)) {
        return new Date(timestamp);
    }
    return null;
};
// https://github.com/text-mask/text-mask/issues/951
const convertDateFnsFormatToDatePipeFormat = (format) => {
    const tokens = format.split('');
    return tokens.map((char) => {
        if (char === 'M')
            return 'm';
        if (char === 'm')
            return 'M';
        return char;
    }).join('');
};
const defaultDateProps = {
    date: {
        format: 'yyyy/MM/dd',
        placeholder: 'YYYY/MM/DD',
        inputMask: [/\d/, /\d/, /\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/],
    },
    datetime: {
        format: 'yyyy/MM/dd HH:mm',
        placeholder: 'YYYY/MM/DD HH:mm',
        inputMask: [/\d/, /\d/, /\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, ' ', /\d/, /\d/, ':', /\d/, /\d/],
    },
};
const parseCustomMask = (mask) => mask.map((el) => {
    if (typeof el === 'string')
        return el;
    if (el.raw)
        return el.raw;
    if (!el.regex)
        throw new Error('Invalid input mask');
    return new RegExp(el.regex);
});
const getDateInputProps = (propertyType = 'datetime', props) => {
    const { dateFormat, placeholderText, inputMask } = props;
    const defaultProps = defaultDateProps[propertyType];
    const format = dateFormat !== null && dateFormat !== void 0 ? dateFormat : defaultProps.format;
    const placeholder = placeholderText !== null && placeholderText !== void 0 ? placeholderText : defaultProps.placeholder;
    const mask = (inputMask === null || inputMask === void 0 ? void 0 : inputMask.mask) ? parseCustomMask(inputMask.mask)
        : defaultProps.inputMask;
    const dateFormatPipe = createAutoCorrectedDatePipe_1.default(convertDateFnsFormatToDatePipeFormat(format));
    return { format, dateFormatPipe, placeholder, parsedMask: mask };
};
/**
 * @classdesc
 *
 *  *
 *
 * Component responsible for showing dates. It is a wrapper to
 * [react datepicker]{@link https://reactdatepicker.com/}.
 *
 * ### Usage
 *
 * ```javascript
 * import { DatePicker, DatePickerProps } from '@adminjs/design-system'
 * ```
 *
 * @component
 * @subcategory Molecules
 * @see https://reactdatepicker.com/
 * @see {@link https://storybook.adminjs.co/?path=/story/designsystem-molecules-datepicker--default Storybook}
 * @see DatePickerProps
 * @hideconstructor
 *
 * @example
 * return (
 * 
 *    console.log(date)}/>
 * 
 * )
 * @section design-system
 */
const DatePicker = (props) => {
    const { value, onChange, disabled, propertyType, inputMask = {}, placeholderText, dateFormat } = props, other = __rest(props, ["value", "onChange", "disabled", "propertyType", "inputMask", "placeholderText", "dateFormat"]);
    const _a = inputMask, { mask: _mask } = _a, otherInputMaskProps = __rest(_a, ["mask"]);
    const handleChange = (newDate) => {
        var _a, _b;
        onChange(((_b = (_a = parseDateSafely(newDate)) === null || _a === void 0 ? void 0 : _a.toISOString) === null || _b === void 0 ? void 0 : _b.call(_a)) || '');
    };
    const dateValue = react_1.useMemo(() => parseDateSafely(value), [value]);
    const { dateFormatPipe, format, parsedMask, placeholder } = getDateInputProps(propertyType, { dateFormat, inputMask, placeholderText });
    return (react_1.default.createElement(StyledDatePicker, { className: css_class_1.cssClass('DatePicker') },
        react_1.default.createElement(react_datepicker_1.default, Object.assign({ customInput: (react_1.default.createElement(react_text_mask_1.default, Object.assign({ pipe: dateFormatPipe, mask: parsedMask, keepCharPositions: true, guide: true, placeholder: placeholder, disabled: disabled }, otherInputMaskProps))), selected: dateValue, onChange: handleChange, showTimeInput: propertyType === 'datetime', dateFormat: format, disabled: disabled }, other)),
        react_1.default.createElement(DatePickerIcon, { icon: "Calendar", color: "white" })));
};
exports.DatePicker = DatePicker;
exports.default = DatePicker;
 *
 *
 * Component responsible for showing dates. It is a wrapper to
 * [react datepicker]{@link https://reactdatepicker.com/}.
 *
 * ### Usage
 *
 * ```javascript
 * import { DatePicker, DatePickerProps } from '@adminjs/design-system'
 * ```
 *
 * @component
 * @subcategory Molecules
 * @see https://reactdatepicker.com/
 * @see {@link https://storybook.adminjs.co/?path=/story/designsystem-molecules-datepicker--default Storybook}
 * @see DatePickerProps
 * @hideconstructor
 *
 * @example
 * return (
 * 
 *    console.log(date)}/>
 * 
 * )
 * @section design-system
 */
const DatePicker = (props) => {
    const { value, onChange, disabled, propertyType, inputMask = {}, placeholderText, dateFormat } = props, other = __rest(props, ["value", "onChange", "disabled", "propertyType", "inputMask", "placeholderText", "dateFormat"]);
    const _a = inputMask, { mask: _mask } = _a, otherInputMaskProps = __rest(_a, ["mask"]);
    const handleChange = (newDate) => {
        var _a, _b;
        onChange(((_b = (_a = parseDateSafely(newDate)) === null || _a === void 0 ? void 0 : _a.toISOString) === null || _b === void 0 ? void 0 : _b.call(_a)) || '');
    };
    const dateValue = react_1.useMemo(() => parseDateSafely(value), [value]);
    const { dateFormatPipe, format, parsedMask, placeholder } = getDateInputProps(propertyType, { dateFormat, inputMask, placeholderText });
    return (react_1.default.createElement(StyledDatePicker, { className: css_class_1.cssClass('DatePicker') },
        react_1.default.createElement(react_datepicker_1.default, Object.assign({ customInput: (react_1.default.createElement(react_text_mask_1.default, Object.assign({ pipe: dateFormatPipe, mask: parsedMask, keepCharPositions: true, guide: true, placeholder: placeholder, disabled: disabled }, otherInputMaskProps))), selected: dateValue, onChange: handleChange, showTimeInput: propertyType === 'datetime', dateFormat: format, disabled: disabled }, other)),
        react_1.default.createElement(DatePickerIcon, { icon: "Calendar", color: "white" })));
};
exports.DatePicker = DatePicker;
exports.default = DatePicker;