package app.model;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GenerationType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.Transient;

import java.util.List;

import lombok.*;
        
import org.springframework.data.relational.core.mapping.Table;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

//@NoArgsConstructor
//@AllArgsConstructor
@Builder
@Entity 
@Table(name="users")
public class Users implements UserDetails {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long uid;

    @NonNull
    @Column(unique = true)
    private String email;
    
    @NonNull
    private String password;
    
    @Builder.Default
    private transient volatile String confirmation = "";
    
    @Builder.Default 
    @NonNull
    private Boolean accountNonExpired = true;
                     
    @Builder.Default
    @NonNull
    private Boolean accountNonLocked = true;
                    
    @Builder.Default
    @NonNull
    private Boolean credentialsNonExpired = true;

    @Builder.Default
    @NonNull
    private Boolean enabled = false;

    @Builder.Default
    @Transient
    private List<GrantedAuthority> authorities = null; 
    
    public Users() {}
     
    public Users(String email, String password, String confirmation,
                  boolean accountNonExpired, boolean accountNonLocked, boolean credentialsNonExpired, boolean enabled, 
                  List<GrantedAuthority> authorities) {
        this.email = email;
        this.password = password;
        this.confirmation = confirmation;
        this.accountNonExpired = accountNonExpired;
        this.accountNonLocked = accountNonLocked;
        this.credentialsNonExpired = credentialsNonExpired;
        this.enabled = enabled;
        this.authorities = authorities;
    }
    
    public Users(Long uid, String email, String password, String confirmation,
                  boolean accountNonExpired, boolean accountNonLocked, boolean credentialsNonExpired, boolean enabled, 
                  List<GrantedAuthority> authorities) {
        this(email,password,confirmation, accountNonExpired,accountNonLocked,credentialsNonExpired,enabled,authorities);
        this.uid = uid;
    }
    
    @Override
    public List<GrantedAuthority> getAuthorities() {
        return authorities;
    }
    
    public String getEmail() { return email; }
     
    public Long getUID() { return uid; }
    
    @Override
    public String getPassword() { return password; }
     
    public String getPasswordConfirmation() { return confirmation; }
    
    @Override
    public String getUsername() { return email; }
    
    @Override
    public boolean isAccountNonExpired() { return accountNonExpired; }

    @Override
    public boolean isAccountNonLocked() { return accountNonLocked; }

    @Override
    public boolean isCredentialsNonExpired() { return credentialsNonExpired; }

    @Override
    public boolean isEnabled() {
        return enabled;
    }
     
    public void setAuthorities(List<GrantedAuthority> authorities) {
        this.authorities = authorities; 
    }
    
}
