package dst.ass1.jpa.model.impl;

import dst.ass1.jpa.model.IEnrollment;
import dst.ass1.jpa.model.IMembership;
import dst.ass1.jpa.model.IParticipant;
import dst.ass1.jpa.util.Constants;

import javax.persistence.*;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collection;

@Entity
@Table(name = Constants.T_PARTICIPANT, uniqueConstraints = {@UniqueConstraint(columnNames = {Constants.M_PARTICIPANT_ACCOUNT, Constants.M_PARTICIPANT_BANK_CODE})})
@PrimaryKeyJoinColumn(name = "id")
@NamedQuery(name = Constants.Q_PARTICIPANT_BY_EMAIL, query =
        "SELECT p FROM " + Constants.T_PARTICIPANT + " as p where p." + Constants.M_PERSON_EMAIL + " = :email")
public class Participant extends Person implements IParticipant {
    @Column(nullable = false, unique = true)
    private String email;

    @Column(name = Constants.M_PERSON_PASSWORD, columnDefinition = "VARBINARY(20)")
    private byte[] password;

    @Column
    private String accountNo;

    @Column
    private String bankCode;

    // FIXME: TESTS VS DB-MODEL?
    @OneToMany(targetEntity = Enrollment.class)
    private Collection<IEnrollment> enrollments = new ArrayList<>();

    // FIXME: TESTS VS DB-MODEL?
    @OneToMany(targetEntity = Membership.class)
    private Collection<IMembership> memberships = new ArrayList<>();


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

    @Override
    public void setEmail(String email) {
        this.email = email;
    }

    // FIXME: This makes no sense. set(get()) - is broken. -> checkPW()?
    @Override
    public byte[] getPassword() {
        return password;
    }

    @Override
    public void setPassword(byte[] password) {
        try {
            this.password = MessageDigest.getInstance("SHA-1").digest(password);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }

    @Override
    public String getAccountNo() {
        return accountNo;
    }

    @Override
    public void setAccountNo(String accountNo) {
        this.accountNo = accountNo;
    }

    @Override
    public String getBankCode() {
        return bankCode;
    }

    @Override
    public void setBankCode(String bankCode) {
        this.bankCode = bankCode;
    }

    @Override
    public Collection<IEnrollment> getEnrollments() {
        return enrollments;
    }

    @Override
    public void setEnrollments(Collection<IEnrollment> enrollments) {
        this.enrollments = enrollments;
    }

    @Override
    public void addEnrollment(IEnrollment enrollment) {
        this.enrollments.add(enrollment);
    }

    @Override
    public Collection<IMembership> getMemberships() {
        return memberships;
    }

    @Override
    public void setMemberships(Collection<IMembership> memberships) {
        this.memberships = memberships;
    }

    @Override
    public void addMembership(IMembership membership) {
        this.memberships.add(membership);
    }
}
