import {AlgorithmType, QuickAlgorithmType} from './analysis.service';

export interface Protein {
  name: string;
  proteinAc: string;
  proteinName: string;
  interactions?: Protein[];
  x?: number;
  y?: number;
  expressionLevel?: number;
}

export interface Tissue {
  id: number;
  name: string;
}

export interface ProteinProteinInteraction {
  from: string;
  to: string;
}

export interface NetworkEdge {
  from: string;
  to: string;
}

export interface Task {
  token: string;
  info: {
    target: 'drug' | 'drug-target',
    algorithm: AlgorithmType | QuickAlgorithmType;
    parameters?: { [key: string]: any };

    workerId?: string;
    jobId?: string;

    progress: number;
    status: string;

    createdAt: string;
    startedAt: string;
    finishedAt: string;

    done: boolean;
    failed: boolean;
  };
  stats: {
    queuePosition: number;
    queueLength: number;
  };
}

export function getProteinNodeId(protein: Protein) {
  return `p_${protein.proteinAc}`;
}

export function getProteinBackendId(protein: Protein) {
  return protein.proteinAc;
}

export function getNodeIdsFromI(pvi: ProteinProteinInteraction) {
  return {
    from: `p_${pvi.from}`,
    to: `p_${pvi.to}`,
  };
}

export function getNodeIdsFromPPI(edge: NetworkEdge, wrappers: { [key: string]: Wrapper }) {
  return {
    from: wrappers[edge.from].nodeId,
    to: wrappers[edge.to].nodeId,
  };
}

export function getNodeIdsFromPDI(edge: NetworkEdge) {
  return {
    from: `p_${edge.from}`,
    to: `d_${edge.to}`,
  };
}

export function getDrugNodeId(drug: Drug) {
  return `d_${drug.drugId}`;
}

export function getDrugBackendId(drug: Drug) {
  return drug.drugId;
}

export function getWrapperFromProtein(protein: Protein): Wrapper {
  return {
    backendId: getProteinBackendId(protein),
    nodeId: getProteinNodeId(protein),
    type: 'host',
    data: protein,
  };
}

export function getWrapperFromDrug(drug: Drug): Wrapper {
  return {
    backendId: getDrugBackendId(drug),
    nodeId: getDrugNodeId(drug),
    type: 'drug',
    data: drug,
  };
}

export type WrapperType = 'host' | 'virus' | 'drug';

export interface Wrapper {
  backendId: string;
  nodeId: string;
  type: WrapperType;
  data: any;
}

export interface Drug {
  drugId: string;
  name: string;
  status: 'approved' | 'investigational';
  inTrial: boolean;
  inLiterature: boolean;
  trialLinks: string[];
}

export interface Dataset {
  label: string;
  strains: string;
  hostTarget: string;
  method: string;
  source: Array<string> | null;
  year: number;
  datasetNames: string;
  backendId: string;
  data: Array<[string, string]>;
}