package org.initialde.yakasave.Domain.Entities;

import jakarta.persistence.*;
import lombok.*;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

import java.util.List;
import java.util.UUID;

@Entity
@Table(name = "users")
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class User {
    @Id
    private UUID id;
    private String username;
    private String password;

    public boolean passwordNotMatches(String password) {
        return !encoder.matches(password, this.password);
    }

    public void hashPassword() {
        this.password = encoder.encode(this.password);
    }

    @OneToMany(mappedBy = "owner")
    private List<SavingsFundSnapshot> savingsFunds;

    @OneToMany(mappedBy = "contributor")
    private List<Contribution> contributions;

    @OneToMany(mappedBy = "approvedBy")
    private List<WithdrawalApproval> receiptsApprovals;


    @ManyToMany(mappedBy = "contributors", cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
    private List<SavingsFundSnapshot> contributedFunds;

    private static final PasswordEncoder encoder = new BCryptPasswordEncoder(16);

    public User(UUID id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    public boolean passwordMatches(String password) {
        return encoder.matches(password, this.password);
    }

    @Override
    public boolean equals(Object o){
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return id.equals(user.getId());
    }
}
