package io.gmss.fiscad.component;

import io.gmss.fiscad.entities.user.Role;
import io.gmss.fiscad.entities.user.User;
import io.gmss.fiscad.enums.UserRole;
import io.gmss.fiscad.repositories.user.RoleRepository;
import io.gmss.fiscad.repositories.user.UserRepository;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

import java.util.HashSet;
import java.util.Set;

@Component
public class DataLoadConfig {

    private final RoleRepository roleRepository;
    private final UserRepository userRepository;
    private final PasswordEncoder passwordEncoder;

    @Value("${app.sourcemind.env.defaultpassword}")
    private String defaultPassword;

    public DataLoadConfig(RoleRepository roleRepository, UserRepository userRepository, PasswordEncoder passwordEncoder) {
        this.roleRepository = roleRepository;
        this.userRepository = userRepository;
        this.passwordEncoder = passwordEncoder;
    }


    @PostConstruct
    public void loadData() {
        loadRoles();
        loadUsers();
    }


    public void loadRoles() {

        if (roleRepository.count() > 0) return;
        Set<Role> roles = new HashSet<>();
        roles.add(new Role(UserRole.ROLE_USER, "Role attribué aux utilisateurs simples."));
        roles.add(new Role(UserRole.ROLE_ADMIN, "Role attribué aux administrateurs du système."));
        roles.add(new Role(UserRole.ROLE_DIRECTEUR, "Role attribué aux directeurs des structures."));
        roles.add(new Role(UserRole.ROLE_SUPERVISEUR, "Role attribué aux superviseurs des structures sur le terrain."));
        roles.add(new Role(UserRole.ROLE_ENQUETEUR, "Role attribué aux enquêteurs des structures sur le terrain."));
        roles.add(new Role(UserRole.ROLE_ANONYMOUS, "Role attribué à toutes les personnes qui s'inscrivent en ligne pour le compte d'une structure."));
        roleRepository.saveAll(roles);

    }

    public void loadUsers() {
        if (userRepository.countAllByUsernameIsNotNull() == 0) {
            User admin = new User();
            admin.setUsername("administrateur@infocad.bj");
            admin.setEmail("administrateur@infocad.bj");
            admin.setTel("N/A");
            admin.setNom("Administrateur");
            admin.setPrenom("Principal");
            admin.setPassword(passwordEncoder.encode(defaultPassword));
            admin.setActive(true);
            Set<Role> roles = new HashSet<>();
            roles.add(roleRepository.findRoleByNom(UserRole.ROLE_ADMIN).get());
            admin.setRoles(roles);
            userRepository.save(admin);
        }
    }

}
