package io.kaif.service;
import java.util.EnumSet;
import java.util.List;
import java.util.Locale;
import java.util.Optional;
import io.kaif.model.account.Account;
import io.kaif.model.account.AccountAccessToken;
import io.kaif.model.account.AccountAuth;
import io.kaif.model.account.AccountOnceToken;
import io.kaif.model.account.AccountStats;
import io.kaif.model.account.Authority;
import io.kaif.model.account.Authorization;
import io.kaif.model.exception.OldPasswordNotMatchException;
public interface AccountService {
Account createViaEmail(String username, String email, String password, Locale locale);
Optional<Account> findMe(Authorization authorization);
Optional<AccountAuth> authenticate(String username, String password);
Optional<AccountAccessToken> strongVerifyAccessToken(String rawAccessToken);
AccountAuth extendsAccessToken(AccountAccessToken accountAccessToken);
boolean isUsernameAvailable(String username);
boolean isEmailAvailable(String email);
void updateAuthorities(Authorization authorization, EnumSet<Authority> authorities);
boolean activate(String inputOnceToken);
void resendActivation(Authorization authorization, Locale locale);
void sendResetPassword(String username, String email, Locale locale);
Optional<AccountOnceToken> findValidResetPasswordToken(String inputOnceToken);
void updatePasswordWithOnceToken(String inputOnceToken, String password, Locale locale);
AccountAuth updateNewPassword(Authorization authorization,
String oldPassword,
String newPassword,
Locale locale) throws OldPasswordNotMatchException;
Optional<AccountAccessToken> tryDecodeAccessToken(String rawAccountAccessToken);
AccountStats loadAccountStats(String username);
Account loadAccount(String caseInsensitiveUsername);
String updateDescription(Authorization authorization, String description);
String loadEditableDescription(Authorization authorization);
void complaintEmail(List<String> emails);
void muteEmail(List<String> emails);
AccountOnceToken createOauthDirectAuthorizeToken(Authorization authorization);
Optional<Account> oauthDirectAuthorize(String inputOnceToken);
}