package com.app.Entity;

import java.util.Collection;
import java.util.Collections;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.OneToMany;

import org.springframework.lang.Nullable;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import com.app.enums.UserRole;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.SuperBuilder;

@Entity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@SuperBuilder
@Inheritance(strategy=InheritanceType.JOINED)
//@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public  class User implements UserDetails{
		@Id
	    @GeneratedValue(strategy = GenerationType.AUTO)
		//@GeneratedValue(strategy = GenerationType.TABLE)

	    private Long id;
	    private String firstname;
	    private String lastname;
	    @Nullable
	    private String password;
	    private String email;
	    private String identifiant;

	    /**@ManyToMany(fetch = FetchType.EAGER)
	    @JoinTable(  name = "user_roles",
	            joinColumns = @JoinColumn(name = "user_id"),
	            inverseJoinColumns = @JoinColumn(name = "role_id"))
	    private Set<Role> roles = new HashSet<>();*/


		@OneToMany(mappedBy = "userSous")
		private List<Souscription> souscription;

	    @Enumerated(EnumType.STRING)
	    private UserRole role;

		@Override
		public Collection<? extends GrantedAuthority> getAuthorities() {
			/*List<GrantedAuthority> authorities = this.roles.stream()
	                .map(role -> new SimpleGrantedAuthority(role.getName()))
	                .collect(Collectors.toList());*/
	        return Collections.singleton(new SimpleGrantedAuthority(role.name()));
		}

		@Override
		public String getUsername() {
			return email;
		}

		@Override
		public String getPassword() {
			return password;
		}

		@Override
		public boolean isAccountNonExpired() {
			return true;
		}

		@Override
		public boolean isAccountNonLocked() {
			return true;
		}

		@Override
		public boolean isCredentialsNonExpired() {
			return true;
		}

		@Override
		public boolean isEnabled() {
			return true;
		}

}
