import moment from "moment";
import { getStartInitialDate } from "./helpers";

export const timeFilterOptions = {
  daily: "Daily",
  weekly: "Weekly",
  monthly: "Monthly",
  quarterly: "Quarterly",
  yearly: "Yearly",
  week_days: "Week Days",
  this_week: "This Week",
  this_month: "This Month",
  this_quarter: "This Quarter",
  this_year: "This Year",
  last_week: "Last Week",
  last_month: "Last Month",
  last_quarter: "Last Quarter",
  last_year: "Last Year",
  last_7_days: "Last 7 Days",
  last_10_days: "Last 10 Days",
  last_20_days: "Last 20 Days",
  last_30_days: "Last 30 Days",
  last_90_days: "Last 90 Days",
  custom: "custom",
}

export const calculateDateRange = (filter: keyof typeof timeFilterOptions, accountCreationDate: string) => {
  const accountCreationMoment = moment(accountCreationDate);
  const startInitialDate = moment(getStartInitialDate(accountCreationMoment), "DD/MM/YYYY");
  const today = moment();
  const endDate = today.format("DD/MM/YYYY");

  const withinRange = (date: moment.Moment) => {
    return date.isAfter(startInitialDate) ? date : startInitialDate;
  };

  const withinRangeEnd = (date: moment.Moment) => {
     const newdate = date.isBefore(today) ? date : today;
     if(newdate.isBefore(startInitialDate) ) return  today;
     return newdate;
  };


  const formatted = (date: moment.Moment) => date.format("DD/MM/YYYY");

  switch (filter) {
    case 'this_week':
      return {
        startDate: formatted(withinRange(moment().startOf('isoWeek'))),
        endDate
      };
    case 'last_week':
      return {
        startDate: formatted(withinRange(moment().subtract(1, 'week').startOf('isoWeek'))),
        endDate : formatted(withinRange(moment().subtract(1, 'week').endOf('isoWeek'))),
      };
    case 'this_month':
      return {
        startDate: formatted(withinRange(moment().startOf('month'))),
        endDate : formatted(withinRangeEnd(moment().endOf('month')))
      };
    case 'last_month':
      return {
        startDate: formatted(withinRange(moment().subtract(1, 'month').startOf('month'))),
        endDate : formatted(withinRangeEnd(moment().subtract(1, 'month').endOf('month')))
      };
    case 'this_quarter':
      return {
        startDate: formatted(withinRange(moment().startOf('quarter'))),
        endDate : formatted(withinRangeEnd(moment().endOf('quarter')))
      };
    case 'last_quarter':
      return {
        startDate: formatted(withinRange(moment().subtract(1, 'quarter').startOf('quarter'))),
        endDate : formatted(withinRangeEnd(moment().subtract(1, 'quarter').endOf('quarter')))
      };
    case 'this_year':
      return {
        startDate: formatted(withinRange(moment().startOf('year'))),
        endDate : formatted(withinRangeEnd(moment().endOf('year')))
      };
    case 'yearly':
      return {
        startDate: formatted(startInitialDate),
        endDate
      };
    case 'last_year':
      // return {
      //   startDate: formatted(withinRange(moment().subtract(1, 'year').startOf('year'))),
      //   endDate:formatted(withinRangeEnd(moment().subtract(1, 'year').endOf('year')))
      // };
      case 'last_year': {
        const lastYearStart = moment().subtract(1, 'year').startOf('year'); // Jan 1 last year
        const lastYearEnd = moment().subtract(1, 'year').endOf('year');     // Dec 31 last year
        
        if (accountCreationMoment.isBefore(lastYearStart)) {
          // Created before last year → full last year range
          return {
            startDate: formatted(lastYearStart),
            endDate: formatted(lastYearEnd),
          };
        } else if (accountCreationMoment.isBetween(lastYearStart, lastYearEnd, undefined, '[]')) {
          // Created during last year → from creation date to Dec 31 last year
          return {
            startDate: formatted(accountCreationMoment),
            endDate: formatted(lastYearEnd),
          };
        } else {
          // Created after last year (this year or later) → from creation date to today
          return {
            startDate: formatted(accountCreationMoment),
            endDate: formatted(today),
          };
        }
      }

    case 'last_7_days':
      return {
        startDate: formatted(withinRange(moment().subtract(6, 'days').startOf('day'))),
        endDate
      };
    case 'last_10_days':
      return {
        startDate: formatted(withinRange(moment().subtract(9, 'days').startOf('day'))),
        endDate
      };
    case 'last_20_days':
      return {
        startDate: formatted(withinRange(moment().subtract(19, 'days').startOf('day'))),
        endDate
      };
    case 'last_30_days':
      return {
        startDate: formatted(withinRange(moment().subtract(29, 'days').startOf('day'))),
        endDate
      };
    case 'week_days':
      return {
        startDate: formatted(startInitialDate),
        endDate
      };
    default:
      return {
        startDate: formatted(startInitialDate),
        endDate
      };
  }
};