import { describe, expect, it } from 'vitest';
import {
  albumHasDistinctDiscCovers,
  resolveAlbumCoverEntry,
  resolveArtistCoverEntry,
  resolveSongFetchCoverArtId,
  resolveTrackCoverEntry,
} from './resolveEntry';

describe('resolveAlbumCoverEntry', () => {
  it('uses bare Navidrome album id on disk', () => {
    const e = resolveAlbumCoverEntry('0DurV2S7arIOBQVEknOPWX', 'al-0Dur_abc');
    expect(e?.cacheEntityId).toBe('0DurV2S7arIOBQVEknOPWX');
    expect(e?.fetchCoverArtId).toBe('al-0Dur_abc');
  });

  it('ignores mf fetch unless distinctDiscCovers', () => {
    expect(resolveAlbumCoverEntry('al-box', 'mf-d2')?.cacheEntityId).toBe('al-box');
    expect(resolveAlbumCoverEntry('al-box', 'mf-d2', true)?.cacheEntityId).toBe('mf-d2');
  });
});

describe('resolveArtistCoverEntry', () => {
  it('keys by artist id', () => {
    const e = resolveArtistCoverEntry('03b645ef2100dfc4', 'ar-03b645ef');
    expect(e?.cacheKind).toBe('artist');
    expect(e?.cacheEntityId).toBe('03b645ef2100dfc4');
    expect(e?.fetchCoverArtId).toBe('ar-03b645ef');
  });
});

describe('resolveTrackCoverEntry', () => {
  it('defaults to album bucket', () => {
    const e = resolveTrackCoverEntry({
      id: 't1',
      albumId: 'al-1',
      coverArt: 'mf-a',
    });
    expect(e?.cacheEntityId).toBe('al-1');
    expect(e?.fetchCoverArtId).toBe('mf-a');
  });
});

describe('resolveSongFetchCoverArtId', () => {
  it('falls back to albumId when coverArt echoes track id', () => {
    expect(
      resolveSongFetchCoverArtId({ id: 'tr-1', coverArt: 'tr-1', albumId: 'al-42' }),
    ).toBe('al-42');
  });
});

describe('albumHasDistinctDiscCovers', () => {
  it('true when discs differ', () => {
    expect(
      albumHasDistinctDiscCovers([
        { id: 't1', albumId: 'al-1', coverArt: 'mf-a', discNumber: 1 },
        { id: 't2', albumId: 'al-1', coverArt: 'mf-b', discNumber: 2 },
      ]),
    ).toBe(true);
  });

  it('false for per-song ids within a single disc (Navidrome)', () => {
    expect(
      albumHasDistinctDiscCovers([
        { id: 't1', albumId: 'al-1', coverArt: 'mf-1', discNumber: 1 },
        { id: 't2', albumId: 'al-1', coverArt: 'mf-2', discNumber: 1 },
        { id: 't3', albumId: 'al-1', coverArt: 'mf-3', discNumber: 1 },
      ]),
    ).toBe(false);
  });

  it('false for per-song ids across discs (no shared disc cover)', () => {
    expect(
      albumHasDistinctDiscCovers([
        { id: 't1', albumId: 'al-1', coverArt: 'mf-1', discNumber: 1 },
        { id: 't2', albumId: 'al-1', coverArt: 'mf-2', discNumber: 1 },
        { id: 't3', albumId: 'al-1', coverArt: 'mf-3', discNumber: 2 },
        { id: 't4', albumId: 'al-1', coverArt: 'mf-4', discNumber: 2 },
      ]),
    ).toBe(false);
  });
});
