import { Option } from '@polkadot/types/';
import BaseTransport from './base';
import { ApiPromise } from '@polkadot/api';
import MembersTransport from './members';
import { SingleLinkedMapEntry } from '../index';
import { Worker, WorkerId } from '@joystream/types/working-group';
import { apiModuleByGroup } from '../consts/workingGroups';
import { WorkingGroupKeys } from '@joystream/types/common';
import { LeadWithProfile } from '../types/workingGroups';

export default class WorkingGroupsTransport extends BaseTransport {
  private membersT: MembersTransport;

  constructor (api: ApiPromise, membersTransport: MembersTransport) {
    super(api);
    this.membersT = membersTransport;
  }

  protected queryByGroup (group: WorkingGroupKeys) {
    const module = apiModuleByGroup[group];
    return this.api.query[module];
  }

  public async currentLead (group: WorkingGroupKeys): Promise <LeadWithProfile | null> {
    const optLeadId = (await this.queryByGroup(group).currentLead()) as Option<WorkerId>;

    if (!optLeadId.isSome) {
      return null;
    }

    const leadWorkerId = optLeadId.unwrap();
    const leadWorkerLink = new SingleLinkedMapEntry(
      Worker,
      await this.queryByGroup(group).workerById(leadWorkerId)
    );
    const leadWorker = leadWorkerLink.value;

    if (!leadWorker.is_active) {
      return null;
    }

    return {
      worker: leadWorker,
      profile: await this.membersT.expectedMemberProfile(leadWorker.member_id)
    };
  }
}