/**
   * +
   *
   * @param username el nom d'usuari
   * @param password la clau d'accés
   * @return torna un bool
   * @throws SQLException
   */
  @Override
  public boolean checkPassword(String username, String password) throws SQLException {
    Connection connection = null;
    PreparedStatement stmt = null;
    try {
      connection = Database.getConnection();

      stmt = connection.prepareStatement(UserDAOQuery.GET_PASSWORD);
      stmt.setString(1, username);

      ResultSet rs = stmt.executeQuery();
      if (rs.next()) {
        String storedPassword = rs.getString("password");
        try {
          MessageDigest md = MessageDigest.getInstance("MD5");
          md.update(password.getBytes());
          String passedPassword = new BigInteger(1, md.digest()).toString(16);

          return passedPassword.equalsIgnoreCase(storedPassword);
        } catch (NoSuchAlgorithmException e) {
        }
      }
      return false;
    } catch (SQLException e) {
      throw e;
    } finally {
      if (stmt != null) stmt.close();
      if (connection != null) connection.close();
    }
  }
  @Override
  public User getUserByLoginId(String loginid) throws SQLException {
    User user = null;
    PropertyResourceBundle prop = (PropertyResourceBundle) ResourceBundle.getBundle("kujosa");

    Connection connection = null;
    PreparedStatement stmt = null;
    try {
      connection = Database.getConnection();

      stmt = connection.prepareStatement(UserDAOQuery.GET_USER_BY_USERNAME);
      stmt.setString(1, loginid);

      ResultSet rs = stmt.executeQuery();
      if (rs.next()) {
        user = new User();
        user.setId(rs.getString("id"));
        user.setLoginid(rs.getString("loginid"));
        user.setEmail(rs.getString("email"));
        user.setFullname(rs.getString("fullname"));
        user.setFilename(rs.getString("image") + ".png");
        user.setImageURL(prop.getString("imgBaseURL") + user.getFilename());
      }
    } catch (SQLException e) {
      throw e;
    } finally {
      if (stmt != null) stmt.close();
      if (connection != null) connection.close();
    }

    return user;
  }
  /**
   * @param loginid serà el nom d'usuari UNIC
   * @param fullname nom del manolo
   * @param email correu de contacte
   * @param password clau d'accès als serveis
   * @param image
   * @return retorna l'usuari un cop creat
   * @throws SQLException
   * @throws UserAlreadyExistsException
   */
  @Override
  public User createUser(
      String loginid, String fullname, String email, String password, InputStream image)
      throws SQLException, UserAlreadyExistsException {
    Connection connection = null;
    PreparedStatement stmt = null;
    UUID uuid = writeAndConvertImage(image);
    String id = null;
    try {
      User user = getUserByLoginId(loginid);
      if (user != null) throw new UserAlreadyExistsException();

      connection = Database.getConnection();

      stmt = connection.prepareStatement(UserDAOQuery.UUID);
      ResultSet rs = stmt.executeQuery();
      if (rs.next()) id = rs.getString(1);
      else throw new SQLException();

      connection.setAutoCommit(false);

      stmt.close();
      stmt = connection.prepareStatement(UserDAOQuery.CREATE_USER);
      stmt.setString(1, id);
      stmt.setString(2, loginid);
      stmt.setString(3, password);
      stmt.setString(4, fullname);
      stmt.setString(5, email);
      stmt.setString(6, uuid.toString());
      stmt.executeUpdate();

      stmt.close();
      stmt = connection.prepareStatement(UserDAOQuery.ASSIGN_ROLE_REGISTERED);
      stmt.setString(1, id);
      stmt.executeUpdate();

      connection.commit();
    } catch (SQLException e) {
      throw e;
    } finally {
      if (stmt != null) stmt.close();
      if (connection != null) {
        connection.setAutoCommit(true);
        connection.close();
      }
    }
    return getUserByLoginId(id);
  }
  /**
   * @param id ahí va el id de usuario que sera cogido de la URI.
   * @return torna un bool 1 si tot ha anat com el cul un 0 si tot ok
   * @throws SQLException
   */
  @Override
  public boolean deleteUser(String id) throws SQLException {
    Connection connection = null;
    PreparedStatement stmt = null;
    try {
      connection = Database.getConnection();

      stmt = connection.prepareStatement(UserDAOQuery.DELETE_USER);
      stmt.setString(1, id);

      int rows = stmt.executeUpdate();
      return (rows == 1);
    } catch (SQLException e) {
      throw e;
    } finally {
      if (stmt != null) stmt.close();
      if (connection != null) connection.close();
    }
  }
  /**
   * @param id nom d'usuari a cercar
   * @return torna la entitat usuari
   * @throws SQLException
   */
  @Override
  public User getUserById(String id) throws SQLException {
    // Modelo a devolver
    User user = null;
    PropertyResourceBundle prop = (PropertyResourceBundle) ResourceBundle.getBundle("kujosa");

    Connection connection = null;
    PreparedStatement stmt = null;
    try {
      // Obtiene la conexión del DataSource
      connection = Database.getConnection();

      // Prepara la consulta
      stmt = connection.prepareStatement(UserDAOQuery.GET_USER_BY_ID);
      // Da valor a los parámetros de la consulta
      stmt.setString(1, id);

      // Ejecuta la consulta
      ResultSet rs = stmt.executeQuery();
      // Procesa los resultados
      if (rs.next()) {
        user = new User();
        user.setId(rs.getString("id"));
        user.setLoginid(rs.getString("loginid"));
        user.setEmail(rs.getString("email"));
        user.setFullname(rs.getString("fullname"));
        user.setFilename(rs.getString("image") + ".png");
        user.setImageURL(prop.getString("imgBaseURL") + user.getFilename());
        user.setAdmin(this.isAdmin(user.getId()));
      }
    } catch (SQLException e) {
      // Relanza la excepción
      throw e;
    } finally {
      // Libera la conexión
      if (stmt != null) stmt.close();
      if (connection != null) connection.close();
    }

    // Devuelve el modelo
    return user;
  }
  @Override
  public User updateProfile(String id, String email, String fullname, InputStream image)
      throws SQLException {
    User user = null;
    UUID uuid = writeAndConvertImage(image);
    Connection connection = null;
    PreparedStatement stmt = null;
    try {
      connection = Database.getConnection();
      user = getUserByLoginId(id);

      stmt = connection.prepareStatement(UserDAOQuery.UPDATE_USER);
      // CORREU
      if (email != null) {
        stmt.setString(1, email);
      } else {
        stmt.setString(1, user.getEmail());
      }
      stmt.setString(2, fullname);
      // IMAGE
      if (image != null) {
        stmt.setString(3, uuid.toString());
      } else {
        stmt.setString(3, user.getFilename());
      }
      stmt.setString(4, id);

      int rows = stmt.executeUpdate();
      if (rows == 1) user = getUserByLoginId(id);
    } catch (SQLException e) {
      throw e;
    } finally {
      if (stmt != null) stmt.close();
      if (connection != null) connection.close();
    }

    return user;
  }
 public boolean isAdmin(String id) throws SQLException {
   Connection connection = null;
   PreparedStatement stmt = null;
   try {
     connection = Database.getConnection();
     String r = null;
     stmt = connection.prepareStatement(UserDAOQuery.IS_ADMIN);
     stmt.setString(1, id);
     ResultSet rs = stmt.executeQuery();
     if (rs.next()) {
       r = (rs.getString("role"));
     }
     if (Role.admin.name().equals(r)) {
       return true;
     } else {
       return false;
     }
   } catch (SQLException e) {
     throw e;
   } finally {
     if (stmt != null) stmt.close();
     if (connection != null) connection.close();
   }
 }