/*
  * (non-Javadoc)
  *
  * @see
  * it.linksmt.corsoedoc.intranet.service.UtenteService#generateEmail(it.
  * linksmt.corsoedoc.intranet.common.UtenteDTO)
  */
 @Override
 public String generateUsername(UtenteDTO utente) {
   if (utente.getId() != null) {
     return datiLoginRepository.getByUtenteId(utente.getId()).getUsername();
   }
   String username = utente.getCognome();
   for (int i = 0; i < utente.getNome().length(); i++) {
     username += utente.getNome().charAt(i);
     DatiLogin dati = datiLoginRepository.getByUsername(username);
     if (dati == null) {
       break;
     }
   }
   return username.toLowerCase();
 }
  @Override
  public void disableUtente(UtenteDTO utente) {

    long id = utente.getId();
    List<DatiLogin> lista = datiLoginRepository.findAll();
    int n = lista.size();
    for (int i = 0; i < n; i++) {
      if (lista.get(i).getTbUtente().getId() == id) {
        if (lista.get(i).getAttivo() == true) {
          lista.get(i).setAttivo(false);
          datiLoginRepository.save(lista.get(i));
        }
      }
    }
  }
  @Override
  public List<UtenteDTO> findAllAttivi() {

    List<Utente> listaUtentiAttivi = new ArrayList<Utente>();

    Map<String, SearchDTO> andMap = new HashMap<String, SearchDTO>();
    SearchDTO so = new SearchDTO();
    so.setOperatore(it.linksmt.corsoedoc.intranet.enumeration.Operator.EQUAL);
    so.setValue(true);
    andMap.put("attivo", so);

    ISpecifications<DatiLogin> u = new ISpecifications<DatiLogin>();
    Specification<DatiLogin> spec = u.findByCriteria(andMap, null);

    /*
     * Ottengo una lista delle tuple di dati login in cui l'utente è attivo
     */
    List<DatiLogin> datiLogin = datiLoginRepository.findAll(spec);

    List<Utente> utentiAttivi = new ArrayList<Utente>();

    for (DatiLogin d : datiLogin) {
      utentiAttivi.add(utenteRepository.findOne(d.getTbUtente().getId()));
    }

    return null;
  }
  @Transactional
  @Override
  public void addUpdateUtente(UtenteInsertJobDTO dto)
      throws DuplicatedEmailException, DuplicatedUsernameException, ParseException {
    UtenteDTO udto = dto.getUtenteDTO();
    Utente u = null;
    if (udto.getId() == null) {
      Mansione m = mansioneRepository.findOne(dto.getIdMansione());
      u = UtenteConverter.convertToEntity(dto.getUtenteDTO());
      u.setTbMansione(m);
    } else {
      u = utenteRepository.getOne(udto.getId());
      u.setCapDomicilio(udto.getCapDomicilio());
      u.setCapResidenza(udto.getCapResidenza());
      u.setCellulare(udto.getCellulare());
      u.setCf(udto.getCf());
      u.setCittaDomicilio(udto.getCittaDomicilio());
      u.setCittaNascita(udto.getCittaDomicilio());
      u.setCittaResidenza(udto.getCittaResidenza());
      u.setCognome(udto.getCognome());
      u.setDataAssunzione(DateConverter.convertFromStringToDate(udto.getDataAssunzione()));
      u.setDataNascita(DateConverter.convertFromStringToDate(udto.getDataNascita()));
      u.setIndirizzoDomicilio(udto.getIndirizzoDomicilio());
      u.setIndirizzoResidenza(udto.getIndirizzoResidenza());
      u.setMail(udto.getMail());
      u.setNome(udto.getNome());
      u.setProvinciaDomicilio(udto.getProvinciaDomicilio());
      u.setProvinciaNascita(udto.getProvinciaNascita());
      u.setProvinciaResidenza(udto.getProvinciaResidenza());
      u.setTbMansione(mansioneRepository.findOne(dto.getIdMansione()));
    }
    utenteRepository.save(u);
    Utente temp = utenteRepository.getByEmail(u.getMail());
    if (temp != null && temp.getId().longValue() != u.getId().longValue()) {
      throw new DuplicatedEmailException("User modified some values on JSON object");
    }

    // E' necessario ricercare l'insieme delle skills già presenti, se siamo
    // in update
    List<UtenteHasSkill> skills = u.getTbUtenteHasTbSkills();
    List<Long> skillsPresenti = new ArrayList<Long>();
    skillsPresenti.addAll(dto.getSkill());
    List<Integer> skillsLivelli = new ArrayList<Integer>();
    skillsLivelli.addAll(dto.getLivello());
    if (skills != null) {
      // A partire da queste tre liste è necessario iterare per ogni skill
      // esistente
      for (int p = 0; p < skills.size(); p++) {
        UtenteHasSkill skill = skills.get(p);
        boolean presente = false;
        // Innanzitutto controlliamo la presenza della skill in esame
        // (presente mappa o meno la presenza)
        for (int i = 0; i < skillsPresenti.size(); i++) {
          Long l = skillsPresenti.get(i);
          if (skill.getTbSkill().getId().longValue() == l) {
            if (skill.getLivello() != skillsLivelli.get(i).intValue()) {
              skill.setLivello(skillsLivelli.get(i));
              utenteSkillRepository.save(skill);
            }
            skillsPresenti.remove(i);
            skillsLivelli.remove(i);
            presente = true;
            break;
          }
        }
        if (!presente) {
          utenteSkillRepository.delete(skill);
        }
      }
    }
    // Una volta arrivati qui, la lista skillsPresenti ha al suo interno
    // solo le skills non ancora collegate, per cui passiamo all'aggiunta
    // delle rimanenti
    for (int i = 0; i < skillsPresenti.size(); i++) {
      Long l = skillsPresenti.get(i);
      Skill skill = skillRepJpa.findOne(l);
      UtenteHasSkill uhs = new UtenteHasSkill();
      uhs.setLivello(skillsLivelli.get(i));
      uhs.setTbSkill(skill);
      uhs.setTbUtente(u);
      utenteSkillRepository.save(uhs);
    }

    // Controlliamo l'esistenza di un utente con la stessa mail aziendale
    DatiLogin datiLogin = datiLoginRepository.getByUsername(dto.getUsername());
    if (datiLogin != null && datiLogin.getTbUtente().getId().longValue() != u.getId().longValue()) {
      throw new DuplicatedUsernameException("Username già presente nel DB per un altro utente");
    }

    if (datiLogin == null) {
      DatiLogin dL = new DatiLogin();
      dL.setAttivo(!dto.getDisabled());
      dL.setPassword(Utility.md5(dto.getPassword()));
      dL.setUsername(dto.getUsername());
      dL.setTbUtente(u);
      Profilo p = profiloRepository.findOne(dto.getIdProfilo());
      dL.setTbProfilo(p);
      datiLoginRepository.save(dL);
    } else {
      if (!dto.getPassword().equals("vecchiapw")) {
        datiLogin.setPassword(Utility.md5(dto.getPassword()));
      }
      datiLogin.setUsername(dto.getUsername());
      datiLogin.setAttivo(!dto.getDisabled());
      datiLogin.setTbProfilo(profiloRepository.findOne(dto.getIdProfilo()));
      datiLoginRepository.save(datiLogin);
    }
    LOG.warn("Insert or update ");
    if (curriculumRepository.getByUtente(u) == null) {
      Curriculum curriculum = new Curriculum();
      curriculum.setUtente(u);
      curriculum.setEsperienze(new String());
      curriculum.setFormazione(new String());
      curriculum.setLingue(new String());
      curriculumRepository.save(curriculum);
    }
  }
 /*
  * (non-Javadoc)
  *
  * @see
  * it.linksmt.corsoedoc.intranet.service.UtenteService#isDisabled(java.lang.
  * Long)
  */
 @Override
 public Boolean isDisabled(Long id) {
   if (id == null) return false;
   DatiLogin dati = datiLoginRepository.getByUtenteId(id);
   return !dati.isAttivo();
 }