import {ChangeDetectionStrategy, Component, inject, OnInit, signal} from '@angular/core'; import {CommonModule} from '@angular/common'; import {MatIconModule} from '@angular/material/icon'; import {RouterModule, Router} from '@angular/router'; import {ReactiveFormsModule, FormBuilder, FormGroup, Validators, FormControl} from '@angular/forms'; import {BetService} from '../../services/bet'; import {UserService} from '../../services/user'; import {GroupService} from '../../services/group'; import {User, Group, CreateBetPayload, BetParticipant} from '../../models/data.models'; import {debounceTime, distinctUntilChanged, switchMap, of} from 'rxjs'; @Component({ selector: 'app-create-bet', standalone: true, imports: [CommonModule, MatIconModule, RouterModule, ReactiveFormsModule], templateUrl: './create-bet.html', styleUrl: './create-bet.css', changeDetection: ChangeDetectionStrategy.OnPush, }) export class CreateBet implements OnInit { private fb = inject(FormBuilder); private router = inject(Router); private betService = inject(BetService); private userService = inject(UserService); private groupService = inject(GroupService); betForm: FormGroup = this.fb.group({ title: ['', [Validators.required]], description: [''], stake: ['10.00', [Validators.required]], isPublic: [true], groupId: [''], }); searchControl = new FormControl(''); searchResults = signal([]); selectedParticipants = signal([]); availableGroups = signal([]); isEditing = false; editingId: string | null = null; ngOnInit() { // Carica gruppi disponibili this.groupService.getGroups().subscribe(groups => { this.availableGroups.set(groups); }); // Ricerca utenti this.searchControl.valueChanges.pipe( debounceTime(300), distinctUntilChanged(), switchMap(query => { if (!query || query.length < 2) return of([]); return this.userService.searchUsers(query); }) ).subscribe(users => { this.searchResults.set(users); }); const navigation = this.router.getCurrentNavigation(); const state = navigation?.extras.state as { bet: any }; // Usiamo any per flessibilità durante la transizione const historyState = typeof window !== 'undefined' ? window.history.state as { bet?: any } : null; const bet = state?.bet || historyState?.bet; if (bet) { this.isEditing = true; this.editingId = bet.id; this.betForm.patchValue({ title: bet.title, description: bet.description, stake: bet.stake, isPublic: bet.isPublic, groupId: bet.groupId }); // Nota: i partecipanti dovrebbero essere popolati se il backend li ritorna come oggetti User } } addParticipant(user: User) { if (!this.selectedParticipants().find(p => p.id === user.id)) { this.selectedParticipants.update(prev => [...prev, user]); } this.searchControl.setValue(''); this.searchResults.set([]); } removeParticipant(userId: string) { this.selectedParticipants.update(prev => prev.filter(p => p.id !== userId)); } onSubmit() { if (this.betForm.valid) { const formValue = this.betForm.value; const participants: BetParticipant[] = this.selectedParticipants().map(user => ({ user: user.id, role: 'PARTICIPANT' })); const payload: CreateBetPayload = { title: formValue.title, description: formValue.description, stake: formValue.stake, isPublic: formValue.isPublic, groupId: formValue.groupId || undefined, participants: participants }; if (this.isEditing && this.editingId) { this.betService.updateBet(this.editingId, payload).subscribe({ next: () => this.router.navigate(['/']), error: (err) => console.error('Error updating bet:', err) }); } else { this.betService.createBet(payload).subscribe({ next: () => this.router.navigate(['/']), error: (err) => console.error('Error creating bet:', err) }); } } } }