package de.ivu.elect.business.aufgabe.entity;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.jee.faces.Messages;

public enum AufgabeGruppierung {

  OHNE {
    @Override
    public List<String> bestimmeGruppen(List<Aufgabe> aufgaben, Messages messages) {
      return Collections.emptyList();
    }

    @Override
    public String getGruppe(Aufgabe aufgabe, Messages messages) {
      return "";
    }
  },
  PRIORITAET {
    @Override
    public List<String> bestimmeGruppen(List<Aufgabe> aufgaben, Messages messages) {
      var result = Arrays.stream(AufgabenPrioritaet.values()).sorted().map(messages::lokalisiere).collect(Collectors.toList());
      Collections.reverse(result);
      return result;
    }

    @Override
    public String getGruppe(Aufgabe aufgabe, Messages messages) {
      return messages.lokalisiere(aufgabe.getPrioritaet());
    }
  },
  STATUS {
    @Override
    public List<String> bestimmeGruppen(List<Aufgabe> aufgaben, Messages messages) {
      return Arrays.stream(AufgabenStatus.values()).sorted().map(messages::lokalisiere).collect(Collectors.toList());
    }

    @Override
    public String getGruppe(Aufgabe aufgabe, Messages messages) {
      return messages.lokalisiere(aufgabe.getStatus());
    }
  },
  AUFGABENTYP {
    @Override
    public List<String> bestimmeGruppen(List<Aufgabe> aufgaben, Messages messages) {
      return Arrays.stream(Aufgabentyp.values()).sorted().map(messages::lokalisiere).collect(Collectors.toList());
    }

    @Override
    public String getGruppe(Aufgabe aufgabe, Messages messages) {
      return messages.lokalisiere(aufgabe.getAufgabentyp());
    }
  },
  KATEGORIE {
    @Override
    public List<String> bestimmeGruppen(List<Aufgabe> aufgaben, Messages messages) {
      var result = aufgaben.stream().map(Aufgabe::getKategorie).filter(StringUtils::isNotBlank).sorted().collect(Collectors.toList());
      if (aufgaben.stream().anyMatch(a -> StringUtils.isBlank(a.getKategorie()))) {
        result.add(0, messages.getMessageForMessageKey("aufgaben.kategorie.ohne"));
      }

      return result;
    }

    @Override
    public String getGruppe(Aufgabe aufgabe, Messages messages) {

      if (StringUtils.isNotBlank(aufgabe.getKategorie())) {
        return aufgabe.getKategorie();
      }
      return messages.getMessageForMessageKey("aufgaben.kategorie.ohne");

    }
  };

  public abstract List<String> bestimmeGruppen(List<Aufgabe> aufgaben, Messages messages);

  public abstract String getGruppe(Aufgabe aufgabe, Messages messages);
}
