import getRandomItems from '@/tools/getRandomItems';
import cards from '@/constants/standardCards';
import type { StandardCard } from '@/types';

export interface Options {
	back: number;
	jokers: boolean;
}

export interface OptionProps {
	back?: number;
	jokers?: boolean;
}

const DEFAULT_OPTIONS = {
	jokers: false,
	back: 1,
};

export default class Cards {
	private options: Options;

	private deck: StandardCard[] = [];
	private backs: StandardCard[] = [];
	private jokers: StandardCard[] = [];

	constructor(options: OptionProps = {}) {
		this.options = { ...DEFAULT_OPTIONS, ...options };

		this.deck = cards.filter((card) => !card.back && (this.options.jokers || !card.joker));
		this.backs = cards.filter((card) => card.back);
		this.jokers = cards.filter((card) => card.joker);
	}

	select(count: number): StandardCard[] {
		return getRandomItems(this.deck, count);
	}

	getBack(style: number): StandardCard {
		style = style || this.options.back;
		return this.backs.find((card) => card.id.startsWith(String(style))) || this.backs[0];
	}

	getJokers(): StandardCard[] {
		return this.jokers;
	}
}
