import moment from "moment";
import { getStartInitialDate } from "./helpers";

export const timeFilterOptions = {
  daily: "Daily",
  today: "Today",
  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 "today":
      return {
        startDate: today.format("DD/MM/YYYY"),
        endDate: endDate
      };
    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
      };
  }
};
