package com.buttongames.butterflymodel.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

/**
 * Model class to represent the phases a user has set for different games
 * on the network. This applies to all PCBs belonging to a particular user.
 * @author skogaby ([email protected])
 */
@Entity
@Table(name = "user_phases")
public class UserPhases implements Externalizable {

    private static final long serialVersionUID = 1L;

    /**
     * ID of the phases, primary key.
     */
    @Id
    @GeneratedValue
    @Column(name = "id")
    private long id;

    /**
     * The user these phases belong to.
     */
    @OneToOne
    @JoinColumn(name = "user_id")
    private ButterflyUser user;

    /**
     * The user's phase for DDR Ace.
     */
    @Column(name = "ddr_16_phase")
    private int ddr16Phase;

    public UserPhases() { }

    public UserPhases(final ButterflyUser user, final int ddr16Phase) {
        this.user = user;
        this.ddr16Phase = ddr16Phase;
    }

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeLong(this.id);
        out.writeObject(this.user);
        out.writeInt(this.ddr16Phase);
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        this.setId(in.readLong());
        this.setUser((ButterflyUser) in.readObject());
        this.setDdr16Phase(in.readInt());
    }

    private long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public ButterflyUser getUser() {
        return user;
    }

    public void setUser(ButterflyUser user) {
        this.user = user;
    }

    public int getDdr16Phase() {
        return ddr16Phase;
    }

    public void setDdr16Phase(int ddr16Phase) {
        this.ddr16Phase = ddr16Phase;
    }
}