package fr.eni.enchere.dal;

import fr.eni.enchere.bo.UserProfil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Repository;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Repository
@Primary
public class UserRepositoryImpl implements UserRepository {

    private final JdbcTemplate jdbcTemplate;
    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    @Autowired
    public UserRepositoryImpl(JdbcTemplate jdbcTemplate, NamedParameterJdbcTemplate namedJdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
        this.namedParameterJdbcTemplate = namedJdbcTemplate;
    }

    @Override
    public List<UserProfil> findAll() {
        return List.of();
    }

    @Override
    public UserProfil findById(int id) {
        return null;
    }

    @Override
    public UserProfil findByUsername(String username) {
        String sql = "SELECT * FROM UTILISATEURS WHERE pseudo = :username OR email = :username";
        Map<String, Object> params = new HashMap<>();
        params.put("username", username);
        UserProfil user = namedParameterJdbcTemplate.queryForObject(sql, params, (rs, rowNum) -> {
            UserProfil userProfile = new UserProfil();
            userProfile.setId(rs.getInt("no_utilisateur"));
            userProfile.setPrenom(rs.getString("prenom"));
            userProfile.setNom(rs.getString("nom"));
            userProfile.setPseudo(rs.getString("pseudo"));
            userProfile.setEmail(rs.getString("email"));
            userProfile.setTelephone(rs.getString("telephone"));
            userProfile.setRue(rs.getString("rue"));
            userProfile.setCode_postal(rs.getString("code_postal"));
            userProfile.setVille(rs.getString("ville"));
            userProfile.setPassword(rs.getString("mot_de_passe"));
            userProfile.setCredit(rs.getFloat("credit"));
            userProfile.setAdmin(rs.getBoolean("administrateur"));
            return userProfile;
        });
        return user;
    }

    @Override
    public void save(UserProfil utilisateur) {
        if (utilisateur.getId() == 0) {
            String sql = "INSERT INTO UTILISATEURS (pseudo, nom, prenom, email, telephone, rue, code_postal, ville, mot_de_passe, credit, administrateur) VALUES (:pseudo, :nom, :prenom, :email, :telephone, :rue, :code_postal, :ville, :mot_de_passe, 0, false)";
            MapSqlParameterSource parameters = new MapSqlParameterSource();
            parameters.addValue("pseudo", utilisateur.getPseudo());
            parameters.addValue("nom", utilisateur.getNom());
            parameters.addValue("prenom", utilisateur.getPrenom());
            parameters.addValue("email", utilisateur.getEmail());
            parameters.addValue("telephone", utilisateur.getTelephone());
            parameters.addValue("rue", utilisateur.getRue());
            parameters.addValue("code_postal", utilisateur.getCode_postal());
            parameters.addValue("ville", utilisateur.getVille());
            parameters.addValue("mot_de_passe", utilisateur.getPassword());

            KeyHolder keyHolder = new GeneratedKeyHolder();
            namedParameterJdbcTemplate.update(sql, parameters, keyHolder, new String[] {"no_utilisateur"});
            if (keyHolder.getKey() != null) {
                utilisateur.setId(keyHolder.getKey().intValue());
            }
        }else {
            //Mettre à jour
        }
    }

    @Override
    public void delete(int id) {

    }
}
