import { MemcmpFilter, PublicKey } from '@solana/web3.js';
import bs58 from 'bs58';
import { BorshAccountsCoder } from './isomorphic/anchor29';
import { encodeName } from './userName';

export function getUserFilter(): MemcmpFilter {
	return {
		memcmp: {
			offset: 0,
			bytes: bs58.encode(BorshAccountsCoder.accountDiscriminator('User')),
		},
	};
}

export function getNonIdleUserFilter(): MemcmpFilter {
	return {
		memcmp: {
			offset: 4350,
			bytes: bs58.encode(Uint8Array.from([0])),
		},
	};
}

export function getUserWithOrderFilter(): MemcmpFilter {
	return {
		memcmp: {
			offset: 4352,
			bytes: bs58.encode(Uint8Array.from([1])),
		},
	};
}

export function getUserWithoutOrderFilter(): MemcmpFilter {
	return {
		memcmp: {
			offset: 4352,
			bytes: bs58.encode(Uint8Array.from([0])),
		},
	};
}

export function getUserWithAuctionFilter(): MemcmpFilter {
	return {
		memcmp: {
			offset: 4354,
			bytes: bs58.encode(Uint8Array.from([1])),
		},
	};
}

export function getUserThatHasBeenLP(): MemcmpFilter {
	return {
		memcmp: {
			offset: 4267,
			bytes: bs58.encode(Uint8Array.from([99])),
		},
	};
}

export function getUserWithName(name: string): MemcmpFilter {
	return {
		memcmp: {
			offset: 72,
			bytes: bs58.encode(Uint8Array.from(encodeName(name))),
		},
	};
}

export function getUsersWithPoolId(poolId: number): MemcmpFilter {
	return {
		memcmp: {
			offset: 4356,
			bytes: bs58.encode(Uint8Array.from([poolId])),
		},
	};
}

export function getUserStatsFilter(): MemcmpFilter {
	return {
		memcmp: {
			offset: 0,
			bytes: bs58.encode(BorshAccountsCoder.accountDiscriminator('UserStats')),
		},
	};
}

export function getUserStatsIsReferredFilter(): MemcmpFilter {
	return {
		memcmp: {
			offset: 188,
			bytes: bs58.encode(Buffer.from(Uint8Array.from([2]))),
		},
	};
}

export function getUserStatsIsReferredOrReferrerFilter(): MemcmpFilter {
	return {
		memcmp: {
			offset: 188,
			bytes: bs58.encode(Buffer.from(Uint8Array.from([3]))),
		},
	};
}

export function getSignedMsgUserOrdersFilter(): MemcmpFilter {
	return {
		memcmp: {
			offset: 0,
			bytes: bs58.encode(
				BorshAccountsCoder.accountDiscriminator('SignedMsgUserOrders')
			),
		},
	};
}

export function getPerpMarketAccountsFilter(): MemcmpFilter {
	return {
		memcmp: {
			offset: 0,
			bytes: bs58.encode(BorshAccountsCoder.accountDiscriminator('PerpMarket')),
		},
	};
}
export function getSpotMarketAccountsFilter(): MemcmpFilter {
	return {
		memcmp: {
			offset: 0,
			bytes: bs58.encode(BorshAccountsCoder.accountDiscriminator('SpotMarket')),
		},
	};
}

export function getRevenueShareEscrowFilter(): MemcmpFilter {
	return {
		memcmp: {
			offset: 0,
			bytes: bs58.encode(
				BorshAccountsCoder.accountDiscriminator('RevenueShareEscrow')
			),
		},
	};
}

export function getConstituentFilter(): MemcmpFilter {
	return {
		memcmp: {
			offset: 0,
			bytes: bs58.encode(
				BorshAccountsCoder.accountDiscriminator('Constituent')
			),
		},
	};
}

export function getConstituentLpPoolFilter(
	lpPoolPublicKey: PublicKey
): MemcmpFilter {
	return {
		memcmp: {
			offset: 72,
			bytes: lpPoolPublicKey.toBase58(),
		},
	};
}
