import { ITeam, EntityType, IEventBus } from '../../types/CalendarTypes';
import { TeamStore } from './TeamStore';
import { BaseEntityService } from '../BaseEntityService';
import { IndexedDBContext } from '../IndexedDBContext';

/**
 * TeamService - CRUD operations for teams in IndexedDB
 *
 * Teams define which resources belong together for hierarchical grouping.
 * Extends BaseEntityService for standard entity operations.
 */
export class TeamService extends BaseEntityService<ITeam> {
  readonly storeName = TeamStore.STORE_NAME;
  readonly entityType: EntityType = 'Team';

  constructor(context: IndexedDBContext, eventBus: IEventBus) {
    super(context, eventBus);
  }

  /**
   * Get teams by IDs
   */
  async getByIds(ids: string[]): Promise<ITeam[]> {
    if (ids.length === 0) return [];
    const results = await Promise.all(ids.map(id => this.get(id)));
    return results.filter((t): t is ITeam => t !== null);
  }

  /**
   * Build reverse lookup: resourceId → teamId
   */
  async buildResourceToTeamMap(): Promise<Record<string, string>> {
    const teams = await this.getAll();
    const map: Record<string, string> = {};

    for (const team of teams) {
      for (const resourceId of team.resourceIds) {
        map[resourceId] = team.id;
      }
    }

    return map;
  }
}
