package io.loli.box.dao;

import io.loli.box.entity.PersistentLogins;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.security.web.authentication.rememberme.PersistentRememberMeToken;
import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

/**
 * @author choco
 */
public interface JpaReMemberMeRepository extends JpaRepository<PersistentLogins, String>, PersistentTokenRepository {

    @Modifying
    @Transactional
    default void createNewToken(PersistentRememberMeToken token) {
        PersistentLogins logins = new PersistentLogins();
        logins.setLastUsed(token.getDate());
        logins.setSeries(token.getSeries());
        logins.setToken(token.getTokenValue());
        logins.setUsername(token.getUsername());
        this.save(logins);
    }

    @Modifying
    @Transactional
    default void updateToken(String series, String tokenValue, Date lastUsed) {
        updateTokenAndLastUsedBySeries(tokenValue, lastUsed, series);
    }

    @Query("update PersistentLogins set token=?, lastUsed=? where series=?")
    @Modifying
    public int updateTokenAndLastUsedBySeries(String token, Date lastUsed, String series);

    public List<PersistentLogins> findBySeries(String series);

    default PersistentRememberMeToken getTokenForSeries(String seriesId) {
        List<PersistentLogins> logins = this.findBySeries(seriesId);
        if (logins.isEmpty()) {
            return null;
        }
        PersistentLogins login = logins.get(0);
        return new PersistentRememberMeToken(login.getUsername(), login.getSeries(), login.getToken(), login.getLastUsed());
    }

    @Modifying
    public int deleteByUsername(String username);

    @Transactional
    default void removeUserTokens(String username){
        this.deleteByUsername(username);
    }
}