import { DateTime } from 'luxon';
import { toGregorian, toJalaali } from 'jalaali-js';

export const TEHRAN_ZONE = 'Asia/Tehran';

export function formatJalaliDateTime(value: Date | string, includeSeconds = true): string {
  const date = typeof value === 'string' ? DateTime.fromISO(value, { zone: 'utc' }) : DateTime.fromJSDate(value, { zone: 'utc' });
  const tehran = date.setZone(TEHRAN_ZONE);
  const jalali = toJalaali(tehran.year, tehran.month, tehran.day);
  const pad = (number: number) => String(number).padStart(2, '0');
  return `${jalali.jy}/${pad(jalali.jm)}/${pad(jalali.jd)} ${pad(tehran.hour)}:${pad(tehran.minute)}${includeSeconds ? `:${pad(tehran.second)}` : ''}`;
}

export function parseJalaliDate(value: string, endOfDay = false): DateTime {
  const match = value.trim().match(/^(\d{4})[/-](\d{1,2})[/-](\d{1,2})$/);
  if (!match) throw new Error('تاریخ جلالی معتبر نیست.');
  const gregorian = toGregorian(Number(match[1]), Number(match[2]), Number(match[3]));
  let date = DateTime.fromObject({ year: gregorian.gy, month: gregorian.gm, day: gregorian.gd }, { zone: TEHRAN_ZONE });
  if (!date.isValid) throw new Error('تاریخ جلالی معتبر نیست.');
  date = endOfDay ? date.endOf('day') : date.startOf('day');
  return date;
}

export function reportRange(input: {
  preset?: 'today' | 'yesterday' | 'custom';
  startDate?: string;
  endDate?: string;
  now?: DateTime;
}): { startUtc: Date; endUtc: Date; label: string } {
  const now = (input.now ?? DateTime.now()).setZone(TEHRAN_ZONE);
  if (input.preset === 'today') {
    return { startUtc: now.startOf('day').toUTC().toJSDate(), endUtc: now.toUTC().toJSDate(), label: 'امروز' };
  }
  if (input.preset === 'yesterday') {
    const day = now.minus({ days: 1 });
    return { startUtc: day.startOf('day').toUTC().toJSDate(), endUtc: day.endOf('day').toUTC().toJSDate(), label: 'دیروز' };
  }
  if (!input.startDate || !input.endDate) throw new Error('تاریخ شروع و پایان الزامی است.');
  const start = parseJalaliDate(input.startDate);
  const end = parseJalaliDate(input.endDate, true);
  if (end < start) throw new Error('تاریخ پایان نمی‌تواند قبل از تاریخ شروع باشد.');
  return { startUtc: start.toUTC().toJSDate(), endUtc: end.toUTC().toJSDate(), label: `${input.startDate} تا ${input.endDate}` };
}

