import { describe, it, expect } from 'vitest';
import { DosageUnit } from '../enums/medicine.enums.js';
import { RefillListStatus } from '../enums/refill.enums.js';
import {
  CreateRefillListSchema,
  UpdateRefillListSchema,
  UpdateRefillListItemSchema,
  RefillListQuerySchema,
  RefillAlertQuerySchema,
} from './refill.schemas.js';

describe('CreateRefillListSchema', () => {
  it('accepts minimal valid input', () => {
    const result = CreateRefillListSchema.parse({ name: 'Weekly Refills' });
    expect(result.fromAlerts).toBe(false);
    expect(result.thresholdDays).toBe(7);
  });

  it('accepts fromAlerts with threshold', () => {
    const result = CreateRefillListSchema.parse({
      name: 'Auto List',
      fromAlerts: true,
      thresholdDays: 14,
    });
    expect(result.fromAlerts).toBe(true);
    expect(result.thresholdDays).toBe(14);
  });

  it('accepts items array', () => {
    const result = CreateRefillListSchema.safeParse({
      name: 'Manual List',
      items: [
        {
          medicineId: 'med-1',
          medicineName: 'Metformin',
          quantity: 30,
          unit: DosageUnit.TABLET,
        },
      ],
    });
    expect(result.success).toBe(true);
  });

  it('rejects empty name', () => {
    expect(CreateRefillListSchema.safeParse({ name: '' }).success).toBe(false);
  });

  it('rejects item with non-positive quantity', () => {
    expect(
      CreateRefillListSchema.safeParse({
        name: 'List',
        items: [{ medicineId: 'med-1', medicineName: 'X', quantity: 0, unit: DosageUnit.TABLET }],
      }).success,
    ).toBe(false);
  });

  it('trims name whitespace', () => {
    const result = CreateRefillListSchema.parse({ name: '  My List  ' });
    expect(result.name).toBe('My List');
  });
});

describe('UpdateRefillListSchema', () => {
  it('accepts empty object', () => {
    expect(UpdateRefillListSchema.safeParse({}).success).toBe(true);
  });

  it('accepts status update', () => {
    const result = UpdateRefillListSchema.parse({ status: RefillListStatus.SHOPPING });
    expect(result.status).toBe(RefillListStatus.SHOPPING);
  });

  it('rejects invalid status', () => {
    expect(UpdateRefillListSchema.safeParse({ status: 'invalid' }).success).toBe(false);
  });
});

describe('UpdateRefillListItemSchema', () => {
  it('accepts checked=true', () => {
    expect(UpdateRefillListItemSchema.safeParse({ checked: true }).success).toBe(true);
  });

  it('accepts actualPrice', () => {
    const result = UpdateRefillListItemSchema.parse({ actualPrice: 12.5 });
    expect(result.actualPrice).toBe(12.5);
  });

  it('rejects negative actualPrice', () => {
    expect(UpdateRefillListItemSchema.safeParse({ actualPrice: -1 }).success).toBe(false);
  });
});

describe('RefillListQuerySchema', () => {
  it('applies default limit', () => {
    expect(RefillListQuerySchema.parse({}).limit).toBe(20);
  });

  it('accepts status filter', () => {
    const result = RefillListQuerySchema.parse({ status: RefillListStatus.ACTIVE });
    expect(result.status).toBe(RefillListStatus.ACTIVE);
  });
});

describe('RefillAlertQuerySchema', () => {
  it('defaults thresholdDays to 7', () => {
    expect(RefillAlertQuerySchema.parse({}).thresholdDays).toBe(7);
  });

  it('coerces thresholdDays from string', () => {
    expect(RefillAlertQuerySchema.parse({ thresholdDays: '14' }).thresholdDays).toBe(14);
  });
});
