import { describe, expect, it } from 'vitest';
import { UUID_REGEX } from '../../shared/constants.js';
import { makeUUID } from '../../demo-fixtures/helpers/deterministic-uuid.js';
import { createTaxCategory } from './tax-category.js';

describe('Factory: Tax Category', () => {
  describe('createTaxCategory', () => {
    it('should create tax category with default values', () => {
      const category = createTaxCategory({name: 'Default Category'});

      // Required field with default
      expect(category.id).toBeDefined();
      expect(category.id).toMatch(UUID_REGEX);

      // Boolean default
      expect(category.taxExcluded).toBe(false);

      // Null default
      expect(category.hashavshevetName).toBeNull();
    });

    it('should generate unique IDs by default', () => {
      const category1 = createTaxCategory({name: 'Category 1'});
      const category2 = createTaxCategory({name: 'Category 2'});

      expect(category1.id).not.toBe(category2.id);
    });

    it('should apply overrides correctly', () => {
      const customId = makeUUID('tax-category', 'tax-cat-expense');
      const category = createTaxCategory({
        id: customId,
        name: 'משרדיות',
        taxExcluded: true,
      });

      expect(category.id).toBe(customId);
      expect(category.name).toBe('משרדיות');
      expect(category.taxExcluded).toBe(true);
    });

    it('should allow partial overrides', () => {
      const category = createTaxCategory({
        name: 'שכר',
      });

      expect(category.name).toBe('שכר');
      expect(category.id).toBeDefined();
      expect(category.taxExcluded).toBe(false);
    });

    it('should preserve all required fields', () => {
      const category = createTaxCategory({name: 'Default Category'});

      // Verify structure matches expected pgtyped interface
      expect(category).toHaveProperty('id');
      expect(category).toHaveProperty('hashavshevetName');
      expect(category).toHaveProperty('taxExcluded');
    });

    it('should handle tax-excluded categories', () => {
      const category = createTaxCategory({
        taxExcluded: true,
        name: 'Tax Exempt',
      });

      expect(category.taxExcluded).toBe(true);
      expect(category.hashavshevetName).toBeNull();
    });

    it('should handle Hashavshevet integration name', () => {
      const category = createTaxCategory({
        name: 'הוצאות משרד',
      });

      expect(category.name).toBe('הוצאות משרד');
    });

    it('should allow explicit null overrides', () => {
      const category = createTaxCategory({
        hashavshevetName: null,
        name: 'No Integration',
      });

      expect(category.hashavshevetName).toBeNull();
    });

    it('should create deterministic categories with seed', () => {
      const category1 = createTaxCategory({ id: makeUUID('tax-category', 'default-category'), name: 'Default Category' });
      const category2 = createTaxCategory({ id: makeUUID('tax-category', 'default-category'), name: 'Default Category' });

      expect(category1.id).toBe(category2.id);
    });
  });
});
