/*******************************************************************************
 * Copyright (c) 2013-2020 LAAS-CNRS (www.laas.fr)
 * 7 Colonel Roche 31077 Toulouse - France
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * Initial Contributors:
 *     Thierry Monteil : Project manager, technical co-manager
 *     Mahdi Ben Alaya : Technical co-manager
 *     Samir Medjiah : Technical co-manager
 *     Khalil Drira : Strategy expert
 *     Guillaume Garzone : Developer
 *     François Aïssaoui : Developer
 *
 * New contributors :
 *******************************************************************************/
package org.eclipse.om2m.commons.entities;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;

import org.eclipse.om2m.commons.constants.DBEntities;
import org.eclipse.om2m.commons.constants.MgmtDefinitionTypes;
import org.eclipse.om2m.commons.constants.ShortName;

/**
 * Label JPA entity
 *
 */
@Entity(name = DBEntities.LABEL_ENTITY)
public class LabelEntity {

	@Id
	@Column(name = ShortName.LABELS)
	protected String label;

	// TODO add link to RESOURCES
	
	@ManyToMany(targetEntity = CSEBaseEntity.class, mappedBy = "labelsEntities")
	protected List<AeEntity> linkedCsb;

	@ManyToMany(targetEntity = AeEntity.class, mappedBy = "labelsEntities")
	protected List<AeEntity> linkedAe;
	
	@ManyToMany(targetEntity = AeAnncEntity.class, mappedBy = "labelsEntities")
	protected List<AeAnncEntity> linkedAeA;

	@ManyToMany(targetEntity = ContainerEntity.class, mappedBy = "labelsEntities")
	protected List<ContainerEntity> linkedCnt;
	
	@ManyToMany(targetEntity = FlexContainerEntity.class, mappedBy = "labelsEntities")
	protected List<FlexContainerEntity> linkedFcnt;
	
	@ManyToMany(targetEntity = FlexContainerAnncEntity.class, mappedBy = "labelsEntities")
	protected List<FlexContainerAnncEntity> linkedFcntA;

	@ManyToMany(targetEntity = ContentInstanceEntity.class, mappedBy = "labelsEntities")
	protected List<ContentInstanceEntity> linkedCin;

	@ManyToMany(targetEntity = GroupEntity.class, mappedBy = "labelsEntities")
	protected List<ContentInstanceEntity> linkedGroup;

	@ManyToMany(targetEntity = RemoteCSEEntity.class, mappedBy = "labelsEntities")
	protected List<RemoteCSEEntity> linkedCsr;

	@ManyToMany(targetEntity = SubscriptionEntity.class, mappedBy = "labelsEntities")
	protected List<SubscriptionEntity> linkedSub;

	@ManyToMany(targetEntity = PollingChannelEntity.class, mappedBy = "labelsEntities")
	protected List<PollingChannelEntity> linkedPch;
	
	@ManyToMany(targetEntity = AccessControlPolicyEntity.class, mappedBy = "labelsEntities")
	protected List<AccessControlPolicyEntity> linkedACP;
	
	@ManyToMany(targetEntity = NodeEntity.class, mappedBy = "labelsEntities")
	protected List<NodeEntity> linkedNodes;
	
	@ManyToMany(targetEntity = NodeAnncEntity.class, mappedBy = "labelsEntities")
	protected List<NodeAnncEntity> linkedNodesA;
	
	@ManyToMany(targetEntity = AreaNwkInfoEntity.class, mappedBy = "labelsEntities")
	protected List<AreaNwkInfoEntity> linkedAni;
	
	@ManyToMany(targetEntity = AreaNwkInfoAnncEntity.class, mappedBy = "labelsEntities")
	protected List<AreaNwkInfoAnncEntity> linkedAniA;
	
	@ManyToMany(targetEntity = AreaNwkDeviceInfoEntity.class, mappedBy = "labelsEntities")
	protected List<AreaNwkDeviceInfoEntity> linkedAndi;
	
	@ManyToMany(targetEntity = AreaNwkDeviceInfoAnncEntity.class, mappedBy = "labelsEntities")
	protected List<AreaNwkDeviceInfoAnncEntity> linkedAndiA;
	
	@ManyToMany(targetEntity = DeviceInfoEntity.class, mappedBy = "labelsEntities")
	protected List<DeviceInfoEntity> linkedDvi;
	
	@ManyToMany(targetEntity = DeviceInfoAnncEntity.class, mappedBy = "labelsEntities")
	protected List<DeviceInfoAnncEntity> linkedDviA;
	
	/**
	 * @return the linkedSub
	 */
	public List<SubscriptionEntity> getLinkedSub() {
		if(linkedSub == null){
			linkedSub = new ArrayList<>();
		}
		return linkedSub;
	}

	/**
	 * @param linkedSub the linkedSub to set
	 */
	public void setLinkedSub(List<SubscriptionEntity> linkedSub) {
		this.linkedSub = linkedSub;
	}

	/**
	 * Constructor
	 */
	public LabelEntity() {
	}

	/**
	 * Constructor with label in argument
	 * @param string label to store
	 */
	public LabelEntity(String string) {
		this.label = string;
	}

	/**
	 * @return the label
	 */
	public String getLabel() {
		return label;
	}

	/**
	 * @param label the label to set
	 */
	public void setLabel(String label) {
		this.label = label;
	}

	
	
	/**
	 * @return the linkedCsb
	 */
	public List<AeEntity> getLinkedCsb() {
		if (this.linkedCsb == null) {
			this.linkedCsb = new ArrayList<>();
		}
		return linkedCsb;
	}

	/**
	 * @param linkedCsb the linkedCsb to set
	 */
	public void setLinkedCsb(List<AeEntity> linkedCsb) {
		this.linkedCsb = linkedCsb;
	}


	public void setLinkedACP(List<AccessControlPolicyEntity> pLinkedACPs) {
		this.linkedACP = pLinkedACPs;
	}
	
	public List<AccessControlPolicyEntity> getLinkedACP() {
		if (this.linkedACP == null) {
			this.linkedACP = new ArrayList<>();
		}
		return this.linkedACP;
	}
	
	/**
	 * @return the linkedAeA
	 */
	public List<AeAnncEntity> getLinkedAeA() {
		if (this.linkedAeA == null) {
			this.linkedAeA = new ArrayList<>();
		}
		return linkedAeA;
	}

	/**
	 * @param linkedAeA the linkedAeA to set
	 */
	public void setLinkedAeA(List<AeAnncEntity> linkedAeA) {
		this.linkedAeA = linkedAeA;
	}
	
	/**
	 * @return the linkedAe
	 */
	public List<AeEntity> getLinkedAe() {
		if (this.linkedAe == null) {
			this.linkedAe = new ArrayList<>();
		}
		return linkedAe;
	}


	/**
	 * @param linkedAe the linkedAe to set
	 */
	public void setLinkedAe(List<AeEntity> linkedAe) {
		this.linkedAe = linkedAe;
	}

	/**
	 * @return the linkedCnt
	 */
	public List<ContainerEntity> getLinkedCnt() {
		if (this.linkedCnt == null) {
			this.linkedCnt = new ArrayList<>();
		}
		return linkedCnt;
	}

	/**
	 * @param linkedCnt the linkedCnt to set
	 */
	public void setLinkedCnt(List<ContainerEntity> linkedCnt) {
		this.linkedCnt = linkedCnt;
	}
	
	/**
	 * @return the linkedFcnt
	 */
	public List<FlexContainerEntity> getLinkedFcnt() {
		if (this.linkedFcnt == null) {
			this.linkedFcnt = new ArrayList<>();
		}
		return linkedFcnt;
	}

	/**
	 * @param linkedFcnt the linkedFcnt to set
	 */
	public void setLinkedFcnt(List<FlexContainerEntity> linkedFcnt) {
		this.linkedFcnt = linkedFcnt;
	}
	
	/**
	 * @return the linkedFcntA
	 */
	public List<FlexContainerAnncEntity> getLinkedFcntA() {
		if (this.linkedFcntA == null) {
			this.linkedFcntA = new ArrayList<>();
		}
		return linkedFcntA;
	}

	/**
	 * @param linkedFcntA the linkedFcnt to set
	 */
	public void setLinkedFcntA(List<FlexContainerAnncEntity> linkedFcntA) {
		this.linkedFcntA = linkedFcntA;
	}

	/**
	 * @return the linkedCin
	 */
	public List<ContentInstanceEntity> getLinkedCin() {
		if (this.linkedCin == null) {
			this.linkedCin = new ArrayList<>();
		}
		return linkedCin;
	}

	/**
	 * @param linkedCin the linkedCin to set
	 */
	public void setLinkedCin(List<ContentInstanceEntity> linkedCin) {
		this.linkedCin = linkedCin;
	}

	/**
	 * @return the linkedGroup
	 */
	public List<ContentInstanceEntity> getLinkedGroup() {
		if (linkedGroup == null) {
			linkedGroup = new ArrayList<>();
		}
		return linkedGroup;
	}

	/**
	 * @param linkedGroup the linkedGroup to set
	 */
	public void setLinkedGroup(List<ContentInstanceEntity> linkedGroup) {
		this.linkedGroup = linkedGroup;
	}

	/**
	 * @return the linkedCsr
	 */
	public List<RemoteCSEEntity> getLinkedCsr() {
		if (this.linkedCsr == null) {
			this.linkedCsr = new ArrayList<>();
		}
		return linkedCsr;
	}

	/**
	 * @param linkedCsr the linkedCsr to set
	 */
	public void setLinkedCsr(List<RemoteCSEEntity> linkedCsr) {
		this.linkedCsr = linkedCsr;
	}

	/**
	 * @return the linkedPch
	 */
	public List<PollingChannelEntity> getLinkedPch() {
		if (this.linkedPch == null) {
			this.linkedPch = new ArrayList<>();
		}
		return linkedPch;
	}

	/**
	 * @param linkedPch the linkedPch to set
	 */
	public void setLinkedPch(List<PollingChannelEntity> linkedPch) {
		this.linkedPch = linkedPch;
	}
	
	/**
	 * @return the linkedNode
	 */
	public List<NodeEntity> getLinkedNodes() {
		if (this.linkedNodes == null) {
			this.linkedNodes = new ArrayList<>();
		}
		return linkedNodes;
	}

	/**
	 * @param linkedNode the linkedNode to set
	 */
	public void setLinkedNodes(List<NodeEntity> linkedNode) {
		this.linkedNodes = linkedNode;
	}
	
	/**
	 * @return the linkedNode
	 */
	public List<NodeAnncEntity> getLinkedNodesA() {
		if (this.linkedNodesA == null) {
			this.linkedNodesA = new ArrayList<>();
		}
		return linkedNodesA;
	}

	/**
	 * @param linkedNode the linkedNode to set
	 */
	public void setLinkedNodesA(List<NodeAnncEntity> linkedNode) {
		this.linkedNodesA = linkedNode;
	}

	/**
	 * @return the linkedAni
	 */
	public List<AreaNwkInfoEntity> getLinkedAni() {
		if (this.linkedAni == null) {
			this.linkedAni = new ArrayList<>();
		}
		return linkedAni;
	}

	/**
	 * @param linkedAni the linkedAni to set
	 */
	public void setLinkedAni(List<AreaNwkInfoEntity> linkedAni) {
		this.linkedAni = linkedAni;
	}

	/**
	 * @return the linkedAni
	 */
	public List<AreaNwkInfoAnncEntity> getLinkedAniA() {
		if (this.linkedAniA == null) {
			this.linkedAniA = new ArrayList<>();
		}
		return linkedAniA;
	}

	/**
	 * @param linkedAni the linkedAni to set
	 */
	public void setLinkedAniA(List<AreaNwkInfoAnncEntity> linkedAni) {
		this.linkedAniA = linkedAni;
	}

	/**
	 * @return the linkedAndi
	 */
	public List<AreaNwkDeviceInfoEntity> getLinkedAndi() {
		if (this.linkedAndi == null) {
			this.linkedAndi = new ArrayList<>();
		}
		return linkedAndi;
	}

	/**
	 * @param linkedAndi the linkedAndi to set
	 */
	public void setLinkedAndi(List<AreaNwkDeviceInfoEntity> linkedAndi) {
		this.linkedAndi = linkedAndi;
	}

	/**
	 * @return the linkedAndi
	 */
	public List<AreaNwkDeviceInfoAnncEntity> getLinkedAndiA() {
		if (this.linkedAndiA == null) {
			this.linkedAndiA = new ArrayList<>();
		}
		return linkedAndiA;
	}

	/**
	 * @param linkedAndi the linkedAndi to set
	 */
	public void setLinkedAndiA(List<AreaNwkDeviceInfoAnncEntity> linkedAndi) {
		this.linkedAndiA = linkedAndi;
	}

	/**
	 * @return the linkedDvi
	 */
	public List<DeviceInfoEntity> getLinkedDvi() {
		if (this.linkedDvi == null) {
			this.linkedDvi = new ArrayList<>();
		}
		return linkedDvi;
	}

	/**
	 * @param linkedDvi the linkedDvi to set
	 */
	public void setLinkedDvi(List<DeviceInfoEntity> linkedDvi) {
		this.linkedDvi = linkedDvi;
	}

	/**
	 * @return the linkedDvi
	 */
	public List<DeviceInfoAnncEntity> getLinkedDviA() {
		if (this.linkedDviA == null) {
			this.linkedDviA = new ArrayList<>();
		}
		return linkedDviA;
	}

	/**
	 * @param linkedDvi the linkedDvi to set
	 */
	public void setLinkedDviA(List<DeviceInfoAnncEntity> linkedDvi) {
		this.linkedDviA = linkedDvi;
	}

	public void addMgmtObj(MgmtObjEntity mgmtObjEntity) {
		BigInteger mgmtDef = mgmtObjEntity.getMgmtDefinition();
		if (mgmtDef.equals(MgmtDefinitionTypes.AREA_NWK_INFO))
			getLinkedAni().add((AreaNwkInfoEntity) mgmtObjEntity);
		else if (mgmtDef.equals(MgmtDefinitionTypes.AREA_NWK_DEVICE_INFO))
			getLinkedAndi().add((AreaNwkDeviceInfoEntity) mgmtObjEntity);
		else if (mgmtDef.equals(MgmtDefinitionTypes.DEVICE_INFO))
			getLinkedDvi().add((DeviceInfoEntity) mgmtObjEntity);
	}

	public void addMgmtObjA(MgmtObjAnncEntity mgmtObjAnncEntity) {
		BigInteger mgmtDef = mgmtObjAnncEntity.getMgmtDefinition();
		if (mgmtDef.equals(MgmtDefinitionTypes.AREA_NWK_INFO))
			getLinkedAniA().add((AreaNwkInfoAnncEntity) mgmtObjAnncEntity);
		else if (mgmtDef.equals(MgmtDefinitionTypes.AREA_NWK_DEVICE_INFO))
			getLinkedAndiA().add((AreaNwkDeviceInfoAnncEntity) mgmtObjAnncEntity);
		else if (mgmtDef.equals(MgmtDefinitionTypes.DEVICE_INFO))
			getLinkedDviA().add((DeviceInfoAnncEntity) mgmtObjAnncEntity);
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj){
			return true;			
		}
		if (obj == null){
			return false;			
		}
		if (getClass() != obj.getClass()){
			return false;			
		}
		LabelEntity other = (LabelEntity) obj;
		if (label == null) {
			if (other.label != null){
				return false;				
			}
		} else if (!label.equals(other.label)){
			return false;			
		}
		return true;
	}
	
}
