import { RecipeParser, ParsedRecipe } from './base.parser';

// Konkret testklass för att komma åt protected-metoden
class TestParser extends RecipeParser {
  canHandle(_url: string): boolean { return true; }
  parse(_html: string): ParsedRecipe {
    return { name: '', ingredients: [] };
  }
  public testParseIngredientLine(line: string) {
    return this.parseIngredientLine(line);
  }
}

describe('RecipeParser.parseIngredientLine', () => {
  const parser = new TestParser();
  const parse = (line: string) => parser.testParseIngredientLine(line);

  describe('enkla mängd + enhet + namn', () => {
    it('parsar "150 g lax"', () => {
      const result = parse('150 g lax');
      expect(result?.quantity).toBe(150);
      expect(result?.unit).toBe('g');
      expect(result?.name).toBe('lax');
    });

    it('parsar "2 dl grädde"', () => {
      const result = parse('2 dl grädde');
      expect(result?.quantity).toBe(2);
      expect(result?.unit).toBe('dl');
      expect(result?.name).toBe('grädde');
    });

    it('parsar "1 msk olivolja"', () => {
      const result = parse('1 msk olivolja');
      expect(result?.quantity).toBe(1);
      expect(result?.unit).toBe('msk');
      expect(result?.name).toBe('olivolja');
    });

    it('parsar "3 st ägg"', () => {
      const result = parse('3 st ägg');
      expect(result?.quantity).toBe(3);
      expect(result?.unit).toBe('st');
      expect(result?.name).toBe('ägg');
    });

    it('parsar "3 ägg" (utan enhet)', () => {
      const result = parse('3 ägg');
      expect(result?.quantity).toBe(3);
      expect(result?.unit).toBe('');
      expect(result?.name).toBe('ägg');
    });
  });

  describe('bråktal', () => {
    it('parsar "1/2 citron"', () => {
      const result = parse('1/2 citron');
      expect(result?.quantity).toBeCloseTo(0.5);
      expect(result?.name).toBe('citron');
    });

    it('parsar "1 1/2 dl mjölk"', () => {
      const result = parse('1 1/2 dl mjölk');
      expect(result?.quantity).toBeCloseTo(1.5);
      expect(result?.unit).toBe('dl');
    });
  });

  describe('utan mängd', () => {
    it('parsar "salt och peppar" (ingen mängd)', () => {
      const result = parse('salt och peppar');
      expect(result?.quantity).toBe(0);
      expect(result?.unit).toBe('');
      expect(result?.name).toBe('salt och peppar');
    });

    it('returnerar null för tom sträng', () => {
      expect(parse('')).toBeNull();
    });
  });

  describe('med parenteser', () => {
    it('parsar "1 förp handskalade räkor (à 570 g)" med note', () => {
      const result = parse('1 förp handskalade räkor (à 570 g)');
      expect(result?.quantity).toBe(1);
      expect(result?.unit).toBe('förp');
      expect(result?.name).toBe('handskalade räkor');
      expect(result?.note).toBe('à 570 g');
    });
  });

  describe('kommatalstal', () => {
    it('parsar "2,5 dl buljong"', () => {
      const result = parse('2,5 dl buljong');
      expect(result?.quantity).toBeCloseTo(2.5);
      expect(result?.unit).toBe('dl');
    });
  });

  describe('strips HTML-taggar', () => {
    it('parsar rad med HTML', () => {
      const result = parse('<b>200</b> g köttfärs');
      expect(result?.quantity).toBe(200);
      expect(result?.unit).toBe('g');
    });
  });
});
