package samuelb.capripol;

import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;

import javax.persistence.*;
import java.awt.*;
import java.util.HashSet;
import java.util.Set;
/*
Entity representing a Framework, has a list of Foci and Groups
 */
@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,
        property = "frameworkID")
public class Framework {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long frameworkID;

    private String frameworkName;

    @ManyToMany
    @JoinTable(name = "FrameworkFoci",
            joinColumns = @JoinColumn(
                    name = "frameworkID"),
            inverseJoinColumns = @JoinColumn(
                    name = "focusID"))
    private Set<Focus> frameworkFoci = new HashSet<>();

    @OneToMany(mappedBy = "framework", fetch = FetchType.EAGER, cascade = CascadeType.REMOVE)
    private Set<Group> groups;

    public Framework(){}

    public Framework(String frameworkName, Set<Focus> frameworkFoci){
        this.frameworkName = frameworkName;
        this.frameworkFoci = frameworkFoci;
    }

    public Framework(String frameworkName) {
        this.frameworkName = frameworkName;
    }

    //Getters and Setters

    public Long getFrameworkID() {
        return frameworkID;
    }

    public String getFrameworkName() {
        return frameworkName;
    }

    public void setFrameworkName(String frameworkName) {
        this.frameworkName = frameworkName;
    }

    public void setFrameworkID(Long frameworkID) {
        this.frameworkID = frameworkID;
    }

    public Set<Focus> getFrameworkFoci() {
        return frameworkFoci;
    }

    public void addFocus(Focus focus){
        this.frameworkFoci.add(focus);
    }

    public void removeFocus(Focus focus){
        frameworkFoci.remove(focus);
    }

    public void setFrameworkFoci(Set<Focus> frameworkFoci) {
        this.frameworkFoci = frameworkFoci;
    }

    public String fociToString(){
        String out = "";
        int count = 0;
        if(frameworkFoci.size() > 0){
            for(Focus focus: frameworkFoci){
                if(count >= 1){
                    out += ", ";
                }
                out += focus.getFocusName();
                count++;
            }
        }else{
            out = "No foci";
        }
        return out;
    }

    public String groupsToString(){
        String out = "";
        int count = 0;
        if(groups.size() > 0){
            for(Group group: groups){
                if(count >= 1){
                    out += ", ";
                }
                out += group.getGroupName();
                count++;
            }
        }else{
            out = "No Groups";
        }
        return out;
    }

    public Set<Group> getGroups() {
        return groups;
    }

    public void setGroups(Set<Group> groups) {
        this.groups = groups;
    }
}
