import { describe, expect, it } from 'vitest';

import { refreshFlowEditTime } from './flowEditTime';

const now = new Date(2026, 8, 28, 14, 35, 47);
const dateField = (name: string, updateOnFlowEdit = true, format = 'yyyy-MM-dd') => ({
  __vModel__: name,
  __config__: { jnpfKey: 'datePicker', updateOnFlowEdit },
  format,
});
const timeField = (name: string, updateOnFlowEdit = true, format = 'HH:mm:ss') => ({
  __vModel__: name,
  __config__: { jnpfKey: 'timePicker', updateOnFlowEdit },
  format,
});
const editConfig = { opType: '-1', id: 'task-1' };

describe('refreshFlowEditTime', () => {
  it('updates enabled date and time fields using their configured formats', () => {
    const fields = [dateField('date'), dateField('dateTime', true, 'yyyy-MM-dd HH:mm'), timeField('time', true, 'HH:mm')];
    const data = { date: 1, dateTime: 2, time: '08:00' };

    const result = refreshFlowEditTime(fields, data, editConfig, now);

    expect(result).toEqual({
      date: new Date(2026, 8, 28).getTime(),
      dateTime: new Date(2026, 8, 28, 14, 35).getTime(),
      time: '14:35',
    });
    expect(data).toEqual({ date: 1, dateTime: 2, time: '08:00' });
  });

  it('preserves fields when the switch is off or the page is not a saved flow edit', () => {
    const fields = [dateField('date', false), timeField('time')];
    const data = { date: 1, time: '08:00' };

    expect(refreshFlowEditTime(fields, data, editConfig, now)).toEqual({ date: 1, time: '14:35:47' });
    for (const config of [
      { opType: '-1', id: '' },
      { opType: 3, id: 'task-1' },
      { ...editConfig, disabled: true },
    ]) {
      expect(refreshFlowEditTime(fields, data, config, now)).toEqual(data);
    }
  });

  it('updates subtable rows but respects field and table write permissions', () => {
    const fields = [
      {
        __vModel__: 'details',
        __config__: { jnpfKey: 'table', children: [dateField('date'), timeField('time')] },
      },
    ];
    const data = {
      details: [
        { date: 1, time: '08:00' },
        { date: 2, time: '09:00' },
      ],
    };

    const result = refreshFlowEditTime(fields, data, { ...editConfig, formOperates: [{ id: 'details-date', write: false }] }, now);
    expect(result.details).toEqual([
      { date: 1, time: '14:35:47' },
      { date: 2, time: '14:35:47' },
    ]);
    expect(data.details[0]?.time).toBe('08:00');
    expect(refreshFlowEditTime(fields, data, { ...editConfig, formOperates: [{ id: 'details', write: false }] }, now)).toEqual(data);
  });
});
