import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';

dayjs.extend(utc);
dayjs.extend(timezone);

export const getDateRanges = () => {
  const now = dayjs();

  const thisMonthStart = now.startOf('month').toDate();
  const lastMonthStart = now.subtract(1, 'month').startOf('month').toDate();
  const lastMonthEnd = now.subtract(1, 'month').endOf('month').toDate();

  const thisWeekStart = now.startOf('week').toDate();
  const lastWeekStart = now.subtract(1, 'week').startOf('week').toDate();
  const lastWeekEnd = now.subtract(1, 'week').endOf('week').toDate();

  return {
    thisMonthStart,
    lastMonthStart,
    lastMonthEnd,
    thisWeekStart,
    lastWeekStart,
    lastWeekEnd,
  };
};

const IST_TIMEZONE = 'Asia/Kolkata';

export const getDateString = (
  isoDate?: string | Date,
  format = 'DD-MM-YYYY',
  timezone = IST_TIMEZONE,
) => (isoDate ? dayjs(isoDate).tz(timezone).format(format) : 'N/A');

export const getTimeString = (
  isoDate?: string | Date,
  timezone = IST_TIMEZONE,
) => (isoDate ? dayjs(isoDate).tz(timezone).format('h:mm A') : 'N/A');

/**
 * Generate array of notification times before a given date
 * @param baseDate The main date/time (e.g., activityDate)
 * @param minutesBeforeArray Array of minutes numbers before baseDate to notify
 * @returns Array of Date objects
 */
/**
 * Generate notifyAt array with minutesOffsetArray relative to baseDate.
 * Positive minutes mean after baseDate, negative mean before.
 * E.g. [-30, 15] means 30 minutes before, 15 minutes after.
 * @param baseDate Date object (e.g., activityDate)
 * @param minutesOffsetArray array of number of minutes offsets (positive or negative)
 * @returns Date[] array of Date objects with adjusted times
 */
export const generateNotifyAtDatesDynamic = (
  baseDate: Date,
  minutesOffsetArray: number[],
): Date[] =>
  minutesOffsetArray.map((offset) =>
    dayjs(baseDate).add(offset, 'minute').toDate(),
  );

export const isValidDate = (value: any): boolean => {
  return value ? dayjs(value).isValid() : false;
};
