fix : field working according to the rc
This commit is contained in:
parent
d1b52dc64c
commit
7ebce2dbcd
@ -24,13 +24,13 @@ export class SelectionService {
|
||||
});
|
||||
currentRow$ = this.currentRow.asObservable();
|
||||
|
||||
private runnerCount: number = 12;
|
||||
private runnerCount: number = 0; // Initialize to 0, will be updated dynamically
|
||||
private multiLegBaseRaceIdx: number = 0;
|
||||
private currentPool: string | null = null; // Track current pool (e.g., 'trb1', 'jkp1')
|
||||
private currentPool: string | null = null; // Track current pool (e.g., 'TBP1', 'MJP1')
|
||||
|
||||
constructor(private sharedStateService: SharedStateService) {
|
||||
this.sharedStateService.runnerCount$.subscribe(count => {
|
||||
this.runnerCount = count || 12;
|
||||
this.runnerCount = count || 0; // Use 0 as default to avoid invalid calculations
|
||||
});
|
||||
this.sharedStateService.sharedData$.subscribe(data => {
|
||||
if (data.type === 'selectedRace') {
|
||||
@ -45,6 +45,86 @@ export class SelectionService {
|
||||
});
|
||||
}
|
||||
|
||||
// Fetch structuredRaceCard from localStorage (prefer rpinfo, fallback to raceCardData)
|
||||
private getStructuredRaceCard(): any {
|
||||
const rpinfo = this.safeGetJSON('rpinfo');
|
||||
if (rpinfo && rpinfo.structuredRaceCard) {
|
||||
return rpinfo.structuredRaceCard;
|
||||
}
|
||||
const rc = this.safeGetJSON('raceCardData');
|
||||
return (rc && rc.structuredRaceCard) ? rc.structuredRaceCard : {};
|
||||
}
|
||||
|
||||
private safeGetJSON(key: string): any | null {
|
||||
try {
|
||||
const raw = localStorage.getItem(key);
|
||||
if (!raw) return null;
|
||||
return JSON.parse(raw);
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// Get runner count for a specific race
|
||||
private getRunnerCountForRace(raceNo: number): number {
|
||||
const structuredRaceCard = this.getStructuredRaceCard();
|
||||
const races = structuredRaceCard?.raceVenueRaces?.races || [];
|
||||
const race = races.find((r: any) => Number(r?.raceNo) === Number(raceNo));
|
||||
if (!race || !Array.isArray(race.horses)) {
|
||||
console.warn(`No valid race data for raceNo ${raceNo}, defaulting to 0`);
|
||||
return 0;
|
||||
}
|
||||
console.log(`Runner count for raceNo ${raceNo}: ${race.horses.length}`);
|
||||
return race.horses.length;
|
||||
}
|
||||
|
||||
// Get runner count for a specific leg in a multi-leg pool
|
||||
private getRunnerCountForLeg(baseIdx: number, leg: number): number {
|
||||
const structuredRaceCard = this.getStructuredRaceCard();
|
||||
const raceNo = this.getRaceForLeg(this.currentPool || '', leg);
|
||||
const races = structuredRaceCard?.raceVenueRaces?.races || [];
|
||||
const race = races.find((r: any) => Number(r?.raceNo) === Number(raceNo));
|
||||
if (!race || !Array.isArray(race.horses)) {
|
||||
console.warn(`No valid race data for pool ${this.currentPool}, leg ${leg}, raceNo ${raceNo}, defaulting to 0`);
|
||||
return 0;
|
||||
}
|
||||
console.log(`Runner count for pool ${this.currentPool}, leg ${leg}, raceNo ${raceNo}: ${race.horses.length}`);
|
||||
return race.horses.length;
|
||||
}
|
||||
|
||||
// Get race number for a specific leg in a multi-leg pool
|
||||
private getRaceForLeg(poolName: string, leg: number): number {
|
||||
const structuredRaceCard = this.getStructuredRaceCard();
|
||||
const poolKey = this.normalizePoolNameToKey(poolName);
|
||||
const poolRaces = structuredRaceCard?.pools?.[poolKey] || [];
|
||||
if (poolRaces.length > leg) {
|
||||
return poolRaces[leg];
|
||||
}
|
||||
const comboRaces = structuredRaceCard?.comboRaces?.[poolKey] || [];
|
||||
if (comboRaces.length > leg) {
|
||||
return comboRaces[leg];
|
||||
}
|
||||
// Fallback to sequential race numbers if pool data is unavailable
|
||||
return this.multiLegBaseRaceIdx + leg;
|
||||
}
|
||||
|
||||
private normalizePoolNameToKey(name: string): string {
|
||||
const lower = name.toLowerCase();
|
||||
const possibleKeys = lower.startsWith('tbp') || lower.startsWith('trb')
|
||||
? ['TBP1', 'TBP2', 'TRB1', 'TRB2']
|
||||
: lower.startsWith('mjp')
|
||||
? ['MJP1', 'MJP2']
|
||||
: lower.startsWith('jpp') || lower.startsWith('jkp')
|
||||
? ['JPP1', 'JPP2', 'JKP1', 'JKP2']
|
||||
: [];
|
||||
const structuredRaceCard = this.getStructuredRaceCard();
|
||||
const pools = structuredRaceCard?.pools || {};
|
||||
for (const key of possibleKeys) {
|
||||
if (key in pools) return key;
|
||||
}
|
||||
return name.toUpperCase();
|
||||
}
|
||||
|
||||
updatePartial(update: Partial<SelectionData>) {
|
||||
const current = this.currentRow.value;
|
||||
const updated: SelectionData = { ...current, ...update };
|
||||
@ -57,6 +137,25 @@ export class SelectionService {
|
||||
if (value > 100) updated.value = 100;
|
||||
updated.total = 0;
|
||||
|
||||
// Dynamically fetch runner count based on context
|
||||
let runnerCount = this.runnerCount;
|
||||
if (numbers.includes('F')) {
|
||||
if (['TBP', 'MJP', 'JPP'].includes(label)) {
|
||||
const legCount = this.getLegCount(label);
|
||||
const legs = this.splitToLegs(numbers, legCount);
|
||||
runnerCount = legs.reduce((acc, leg, idx) => {
|
||||
if (leg.includes('F')) {
|
||||
return acc + this.getRunnerCountForLeg(this.multiLegBaseRaceIdx, idx);
|
||||
}
|
||||
return acc + leg.filter(n => typeof n === 'number').length;
|
||||
}, 0);
|
||||
} else {
|
||||
// For single-race bets, use the current race's runner count
|
||||
const selectedRace = this.sharedStateService.getSelectedRace();
|
||||
runnerCount = this.getRunnerCountForRace(selectedRace);
|
||||
}
|
||||
}
|
||||
|
||||
if ((numbers.length > 0 || numbers.includes('F')) && value > 0 && label) {
|
||||
switch (label) {
|
||||
case 'WNP':
|
||||
@ -66,7 +165,7 @@ export class SelectionService {
|
||||
case 'SHW':
|
||||
case 'WSP': {
|
||||
updated.total = numbers.includes('F')
|
||||
? this.runnerCount * value * 10
|
||||
? runnerCount * value * 10
|
||||
: numbers.filter(n => typeof n === 'number').length * value * 10;
|
||||
break;
|
||||
}
|
||||
@ -87,8 +186,8 @@ export class SelectionService {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
const group1Numbers = group1.includes('F') ? Array.from({ length: this.runnerCount }, (_, i) => i + 1) : group1.filter(n => typeof n === 'number') as number[];
|
||||
const group2Numbers = group2.includes('F') ? Array.from({ length: this.runnerCount }, (_, i) => i + 1) : group2.filter(n => typeof n === 'number') as number[];
|
||||
const group1Numbers = group1.includes('F') ? Array.from({ length: runnerCount }, (_, i) => i + 1) : group1.filter(n => typeof n === 'number') as number[];
|
||||
const group2Numbers = group2.includes('F') ? Array.from({ length: runnerCount }, (_, i) => i + 1) : group2.filter(n => typeof n === 'number') as number[];
|
||||
if (isBoxed) {
|
||||
const allNumbers = [...new Set([...group1Numbers, ...group2Numbers])];
|
||||
combinations = this.calculatePermutations(allNumbers.length);
|
||||
@ -126,8 +225,8 @@ export class SelectionService {
|
||||
}
|
||||
combinations = pairSet.size;
|
||||
} else {
|
||||
const group1Numbers = group1.includes('F') ? Array.from({ length: this.runnerCount }, (_, i) => i + 1) : group1.filter(n => typeof n === 'number') as number[];
|
||||
const group2Numbers = group2.includes('F') ? Array.from({ length: this.runnerCount }, (_, i) => i + 1) : group2.filter(n => typeof n === 'number') as number[];
|
||||
const group1Numbers = group1.includes('F') ? Array.from({ length: runnerCount }, (_, i) => i + 1) : group1.filter(n => typeof n === 'number') as number[];
|
||||
const group2Numbers = group2.includes('F') ? Array.from({ length: runnerCount }, (_, i) => i + 1) : group2.filter(n => typeof n === 'number') as number[];
|
||||
if (isBoxed) {
|
||||
const allNumbers = [...new Set([...group1Numbers, ...group2Numbers])];
|
||||
combinations = this.calculateCombinations(allNumbers.length);
|
||||
@ -174,9 +273,9 @@ export class SelectionService {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
const group1Numbers = group1.includes('F') ? Array.from({ length: this.runnerCount }, (_, i) => i + 1) : group1.filter(n => typeof n === 'number') as number[];
|
||||
const group2Numbers = group2.includes('F') ? Array.from({ length: this.runnerCount }, (_, i) => i + 1) : group2.filter(n => typeof n === 'number') as number[];
|
||||
const group3Numbers = group3.includes('F') ? Array.from({ length: this.runnerCount }, (_, i) => i + 1) : group3.filter(n => typeof n === 'number') as number[];
|
||||
const group1Numbers = group1.includes('F') ? Array.from({ length: runnerCount }, (_, i) => i + 1) : group1.filter(n => typeof n === 'number') as number[];
|
||||
const group2Numbers = group2.includes('F') ? Array.from({ length: runnerCount }, (_, i) => i + 1) : group2.filter(n => typeof n === 'number') as number[];
|
||||
const group3Numbers = group3.includes('F') ? Array.from({ length: runnerCount }, (_, i) => i + 1) : group3.filter(n => typeof n === 'number') as number[];
|
||||
if (isBoxed) {
|
||||
const allNumbers = [...new Set([...group1Numbers, ...group2Numbers, ...group3Numbers])];
|
||||
combinations = this.calculatePermutationsN(allNumbers.length, 3);
|
||||
@ -204,14 +303,11 @@ export class SelectionService {
|
||||
const legCount = this.getLegCount(label);
|
||||
const legs = this.splitToLegs(numbers, legCount);
|
||||
|
||||
// Use pool-specific race indices from currentPool
|
||||
const baseIdx = this.currentPool === 'mjp1' ? 0 : this.multiLegBaseRaceIdx;
|
||||
|
||||
const legCounts = legs.map((leg, idx) => {
|
||||
let count = 0;
|
||||
for (const item of leg) {
|
||||
if (item === 'F') {
|
||||
count += this.getRunnerCountForLeg(baseIdx, idx);
|
||||
count += this.getRunnerCountForLeg(this.multiLegBaseRaceIdx, idx);
|
||||
} else if (typeof item === 'number') {
|
||||
count += 1;
|
||||
}
|
||||
@ -294,44 +390,6 @@ export class SelectionService {
|
||||
}
|
||||
}
|
||||
|
||||
private getRunnerCountForLeg(baseIdx: number, leg: number): number {
|
||||
const raceCardData = JSON.parse(localStorage.getItem('raceCardData') || '{}');
|
||||
// Use pool-specific race index mapping
|
||||
const raceIdx = this.getRaceForLeg(this.currentPool || '', leg) - 1;
|
||||
const race = raceCardData?.raceVenueRaces?.races?.[raceIdx];
|
||||
console.log('getRunnerCountForLeg:', { pool: this.currentPool, leg, raceIdx, race }); // Enhanced debugging
|
||||
if (!race) {
|
||||
console.warn(`No race data found for pool ${this.currentPool}, raceIdx ${raceIdx}, defaulting to 12`);
|
||||
return 12;
|
||||
}
|
||||
if (Array.isArray(race)) {
|
||||
console.log(`Race data is array with length ${race.length}`);
|
||||
return race.length;
|
||||
}
|
||||
if (race.runners && Array.isArray(race.runners)) {
|
||||
console.log(`Race data has runners array with length ${race.runners.length}`);
|
||||
return race.runners.length;
|
||||
}
|
||||
console.warn(`Invalid race data structure for pool ${this.currentPool}, raceIdx ${raceIdx}, defaulting to 12`);
|
||||
return 12;
|
||||
}
|
||||
|
||||
private getRaceForLeg(poolName: string, leg: number): number {
|
||||
const raceCardData = JSON.parse(localStorage.getItem('raceCardData') || '{}');
|
||||
const poolRaces = raceCardData?.raceVenueRaces?.pools?.[poolName] || [];
|
||||
if (poolRaces.length > leg) {
|
||||
return poolRaces[leg];
|
||||
}
|
||||
// Fallback to default race mapping
|
||||
const raceMap: { [key: string]: number[] } = {
|
||||
'mjp1': [1, 2, 3, 4],
|
||||
'jkp1': [3, 4, 5, 6, 7],
|
||||
'trb1': [2, 3, 4],
|
||||
'trb2': [5, 6, 7]
|
||||
};
|
||||
return raceMap[poolName]?.[leg] || (this.multiLegBaseRaceIdx + leg);
|
||||
}
|
||||
|
||||
private calculateTotal(data: SelectionData): number {
|
||||
const temp = new BehaviorSubject<SelectionData>(data);
|
||||
const originalCurrent = this.currentRow;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user