import { describe, expect, it } from 'vitest';
import { DecalOverride } from './DecalOverride';

describe('DecalOverride', () => {
  it('should create a decal override', () => {
    const override = DecalOverride.create({
      leagueId: 'league1',
      seasonId: 'season1',
      decalId: 'decal1',
      newX: 0.5,
      newY: 0.3,
    });
    expect(override.props).toEqual({
      leagueId: 'league1',
      seasonId: 'season1',
      decalId: 'decal1',
      newX: 0.5,
      newY: 0.3,
    });
  });

  it('should throw on empty leagueId', () => {
    expect(() =>
      DecalOverride.create({
        leagueId: '',
        seasonId: 'season1',
        decalId: 'decal1',
        newX: 0.5,
        newY: 0.3,
      })
    ).toThrow('DecalOverride leagueId is required');
  });

  it('should throw on empty seasonId', () => {
    expect(() =>
      DecalOverride.create({
        leagueId: 'league1',
        seasonId: '',
        decalId: 'decal1',
        newX: 0.5,
        newY: 0.3,
      })
    ).toThrow('DecalOverride seasonId is required');
  });

  it('should throw on empty decalId', () => {
    expect(() =>
      DecalOverride.create({
        leagueId: 'league1',
        seasonId: 'season1',
        decalId: '',
        newX: 0.5,
        newY: 0.3,
      })
    ).toThrow('DecalOverride decalId is required');
  });

  it('should throw on newX less than 0', () => {
    expect(() =>
      DecalOverride.create({
        leagueId: 'league1',
        seasonId: 'season1',
        decalId: 'decal1',
        newX: -0.1,
        newY: 0.3,
      })
    ).toThrow('DecalOverride newX must be between 0 and 1');
  });

  it('should throw on newX greater than 1', () => {
    expect(() =>
      DecalOverride.create({
        leagueId: 'league1',
        seasonId: 'season1',
        decalId: 'decal1',
        newX: 1.1,
        newY: 0.3,
      })
    ).toThrow('DecalOverride newX must be between 0 and 1');
  });

  it('should throw on newY less than 0', () => {
    expect(() =>
      DecalOverride.create({
        leagueId: 'league1',
        seasonId: 'season1',
        decalId: 'decal1',
        newX: 0.5,
        newY: -0.1,
      })
    ).toThrow('DecalOverride newY must be between 0 and 1');
  });

  it('should throw on newY greater than 1', () => {
    expect(() =>
      DecalOverride.create({
        leagueId: 'league1',
        seasonId: 'season1',
        decalId: 'decal1',
        newX: 0.5,
        newY: 1.1,
      })
    ).toThrow('DecalOverride newY must be between 0 and 1');
  });

  it('should equal same override', () => {
    const o1 = DecalOverride.create({
      leagueId: 'league1',
      seasonId: 'season1',
      decalId: 'decal1',
      newX: 0.5,
      newY: 0.3,
    });
    const o2 = DecalOverride.create({
      leagueId: 'league1',
      seasonId: 'season1',
      decalId: 'decal1',
      newX: 0.5,
      newY: 0.3,
    });
    expect(o1.equals(o2)).toBe(true);
  });

  it('should not equal different override', () => {
    const o1 = DecalOverride.create({
      leagueId: 'league1',
      seasonId: 'season1',
      decalId: 'decal1',
      newX: 0.5,
      newY: 0.3,
    });
    const o2 = DecalOverride.create({
      leagueId: 'league2',
      seasonId: 'season1',
      decalId: 'decal1',
      newX: 0.5,
      newY: 0.3,
    });
    expect(o1.equals(o2)).toBe(false);
  });
});