import { describe, it, expect } from 'vitest';
import {
  calculateSlotCount,
  generateSlotPositions,
  filterStones,
} from './calculations';
import type { Stone } from '../types/index';

describe('calculateSlotCount', () => {
  it('S (16cm) + 8mm = 20 yuva', () => {
    expect(calculateSlotCount(16, 8)).toBe(20);
  });

  it('M (18cm) + 8mm = 22 yuva', () => {
    expect(calculateSlotCount(18, 8)).toBe(22);
  });

  it('L (20cm) + 8mm = 25 yuva', () => {
    expect(calculateSlotCount(20, 8)).toBe(25);
  });

  it('S (16cm) + 6mm = 26 yuva', () => {
    expect(calculateSlotCount(16, 6)).toBe(26);
  });

  it('M (18cm) + 6mm = 30 yuva', () => {
    expect(calculateSlotCount(18, 6)).toBe(30);
  });

  it('L (20cm) + 6mm = 33 yuva', () => {
    expect(calculateSlotCount(20, 6)).toBe(33);
  });
});

describe('generateSlotPositions', () => {
  it('doğru sayıda pozisyon üretir', () => {
    const positions = generateSlotPositions(10, 100);
    expect(positions).toHaveLength(10);
  });

  it('her pozisyonun index, angle, x, y alanları vardır', () => {
    const positions = generateSlotPositions(4, 50);
    positions.forEach((pos, i) => {
      expect(pos.index).toBe(i);
      expect(typeof pos.angle).toBe('number');
      expect(typeof pos.x).toBe('number');
      expect(typeof pos.y).toBe('number');
    });
  });

  it('tüm pozisyonlar verilen yarıçap üzerindedir', () => {
    const radius = 100;
    const positions = generateSlotPositions(8, radius);
    positions.forEach((pos) => {
      const distance = Math.sqrt(pos.x ** 2 + pos.y ** 2);
      expect(distance).toBeCloseTo(radius, 5);
    });
  });

  it('0 yuva için boş dizi döndürür', () => {
    expect(generateSlotPositions(0, 100)).toEqual([]);
  });

  it('ilk pozisyon 0 radyan açıdadır', () => {
    const positions = generateSlotPositions(6, 50);
    expect(positions[0].angle).toBe(0);
    expect(positions[0].x).toBeCloseTo(50, 5);
    expect(positions[0].y).toBeCloseTo(0, 5);
  });
});

describe('filterStones', () => {
  const stones: Stone[] = [
    { id: 1, name: 'Akik', image: '/stones/akik.jpg', active: true },
    { id: 2, name: 'Amazonit', image: '/stones/amazonit.jpg', active: true },
    { id: 3, name: 'Akuamarin', image: '/stones/akuamarin.jpg', active: true },
    { id: 4, name: 'Lapis Lazuli', image: '/stones/lapis.jpg', active: true },
  ];

  it('boş sorgu tüm taşları döndürür', () => {
    expect(filterStones(stones, '')).toEqual(stones);
  });

  it('boşluklu sorgu tüm taşları döndürür', () => {
    expect(filterStones(stones, '   ')).toEqual(stones);
  });

  it('isme göre filtreler (büyük/küçük harf duyarsız)', () => {
    const result = filterStones(stones, 'ak');
    expect(result).toHaveLength(2);
    expect(result.map((s) => s.name)).toEqual(['Akik', 'Akuamarin']);
  });

  it('büyük harfle arama da çalışır', () => {
    const result = filterStones(stones, 'LAPIS');
    expect(result).toHaveLength(1);
    expect(result[0].name).toBe('Lapis Lazuli');
  });

  it('eşleşme yoksa boş dizi döndürür', () => {
    expect(filterStones(stones, 'xyz')).toEqual([]);
  });

  it('boş taş listesinde boş dizi döndürür', () => {
    expect(filterStones([], 'akik')).toEqual([]);
  });
});
