import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'sortSuppliersByCutoffTime',
  pure: false,
  standalone: false
})
export class SortSuppliersByCutoffTimePipe implements PipeTransform {
  transform(cartData: any): any[] {
    if (!cartData || typeof cartData !== 'object') return [];

    const arr = Object.keys(cartData).map(key => ({ key, value: cartData[key] }));

    // Get current time in America/New_York
    const now = new Date();
    const formatter = new Intl.DateTimeFormat('en-US', {
      timeZone: 'America/New_York',
      hour: 'numeric',
      minute: 'numeric',
      hour12: false,
      year: 'numeric',
      month: 'numeric',
      day: 'numeric'
    });

    const partsObj = Object.fromEntries(
      formatter.formatToParts(now).map(p => [p.type, parseInt(p.value)])
    );

    const nowNY = Date.UTC(
      partsObj['year'],
      partsObj['month'] - 1,
      partsObj['day'],
      partsObj['hour'],
      partsObj['minute']
    );

    const parseCutoffTime = (timeStr: string): number | null => {
      if (!timeStr || timeStr === 'Closed Today') return null;

      const [time, modifier] = timeStr.split(' ');
      if (!time || !modifier) return null;

      let [hours, minutes] = time.split(':').map(Number);
      if (modifier === 'PM' && hours !== 12) hours += 12;
      if (modifier === 'AM' && hours === 12) hours = 0;

      return Date.UTC(
        partsObj['year'],
        partsObj['month'] - 1,
        partsObj['day'],
        hours,
        minutes
      );
    };

    return arr.slice().sort((a, b) => {
      const cutoffA = a.value?.shippingData?.cutoff_time;
      const cutoffB = b.value?.shippingData?.cutoff_time;

      const timeA = parseCutoffTime(cutoffA);
      const timeB = parseCutoffTime(cutoffB);

      const getGroup = (time: number | null): number => {
        if (time === null) return 2;     // Closed Today / empty → last
        if (time > nowNY) return 0;      // Future → first (today only)
        return 1;                        // Past → middle
      };

      const groupA = getGroup(timeA);
      const groupB = getGroup(timeB);

      if (groupA !== groupB) return groupA - groupB;

      if (timeA !== null && timeB !== null) {
        return timeA - timeB; // sort ascending within group
      }

      return 0;
    });
  }
}
