/*******************************************************************************

 * 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.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;

import org.eclipse.om2m.commons.constants.DBEntities;
import org.eclipse.om2m.commons.constants.ShortName;

/**
 * Container JPA entity
 *
 */
@Entity(name=DBEntities.CONTAINER_ENTITY)
@Inheritance(strategy = InheritanceType.JOINED)
public class ContainerEntity extends AnnounceableSubordinateEntity{
	@Column(name= ShortName.STATETAG)
	protected BigInteger stateTag;
	@Column(name= ShortName.CREATOR)
	protected String creator;
	@Column(name= ShortName.MAX_NR_OF_INSTANCES)
	protected BigInteger maxNrOfInstances;
	@Column(name= ShortName.MAX_BYTE_SIZE)
	protected BigInteger maxByteSize;
	@Column(name= ShortName.CURRENT_NUMBER_OF_INSTANCES)
	protected BigInteger currentNrOfInstances;
	@Column(name= ShortName.MAX_INSTANCE_AGE)
	protected BigInteger maxInstanceAge;
	@Column(name= ShortName.LOCATION_ID)
	protected String locationID;
	@Column(name= ShortName.ONTOLOGY_REF)
	protected String ontologyRef;
	
	@OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY, mappedBy="parentCnt")
	@JoinTable(
			name = DBEntities.CNTSUB_JOIN,
			joinColumns = { @JoinColumn(name = DBEntities.CNT_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
			inverseJoinColumns = { @JoinColumn(name = DBEntities.SUB_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }
			)
	protected List<SubscriptionEntity> subscriptions;
	
	/** List of AccessControlPolicies */
	@OneToMany(fetch=FetchType.LAZY)
	@JoinTable(
			name = DBEntities.CNTACP_JOIN,
			joinColumns = { @JoinColumn(name = DBEntities.CNT_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
			inverseJoinColumns = { @JoinColumn(name = DBEntities.ACP_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }
			)
	protected List<AccessControlPolicyEntity> accessControlPolicies;
	
	/** List of DynamicAuthorizationConsultations*/
	@ManyToMany(fetch=FetchType.LAZY, mappedBy="linkedContainerEntities")
	@JoinTable(
			name = DBEntities.CNT_DAC_JOIN,
			joinColumns = { @JoinColumn(name = DBEntities.CNT_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
			inverseJoinColumns = { @JoinColumn(name = DBEntities.DAC_JOINID, referencedColumnName = ShortName.RESOURCE_ID) }
			)
	protected List<DynamicAuthorizationConsultationEntity> dynamicAuthorizationConsultations;
	
	/** List of child Container Entities */
	@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.ALL})
	@JoinTable(
			name=DBEntities.CNTCNTCHILD_JOIN,
			joinColumns={@JoinColumn(name=DBEntities.CNT_JOIN_ID, referencedColumnName=ShortName.RESOURCE_ID)},
			inverseJoinColumns={@JoinColumn(name=DBEntities.CNTCH_JOIN_ID, referencedColumnName=ShortName.RESOURCE_ID)}
			)
	protected List<ContainerEntity> childContainers;
	
	/** List of child ContentInstances Entities */
	@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.ALL})
	@JoinTable(
			name=DBEntities.CNTCINCHILD_JOIN,
			joinColumns={@JoinColumn(name=DBEntities.CNT_JOIN_ID, referencedColumnName=ShortName.RESOURCE_ID)},
			inverseJoinColumns={@JoinColumn(name=DBEntities.CINCH_JOIN_ID, referencedColumnName=ShortName.RESOURCE_ID)}
			)
	@OrderBy("creationTime")
	protected List<ContentInstanceEntity> childContentInstances;
	
	/** List of child FlexContainer entities */
	@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, mappedBy="parentContainer")
	@JoinTable(
			name=DBEntities.CNT_FCNTCHILD_JOIN,
			joinColumns={@JoinColumn(name=DBEntities.CNT_JOIN_ID, referencedColumnName=ShortName.RESOURCE_ID)},
			inverseJoinColumns={@JoinColumn(name=DBEntities.FCNT_JOIN_ID, referencedColumnName=ShortName.RESOURCE_ID)}
			)
	protected List<FlexContainerEntity> childFlexContainers;

	// Database link to the possible parent Container
	@ManyToOne(fetch=FetchType.LAZY, targetEntity=ContainerEntity.class)
	@JoinTable(
			name=DBEntities.CNTCNTCHILD_JOIN,
			inverseJoinColumns={@JoinColumn(name=DBEntities.CNT_JOIN_ID, referencedColumnName=ShortName.RESOURCE_ID)},
			joinColumns={@JoinColumn(name=DBEntities.CNTCH_JOIN_ID, referencedColumnName=ShortName.RESOURCE_ID)}
			)
	protected ContainerEntity parentContainer;
	
	@ManyToOne(fetch=FetchType.LAZY, targetEntity=FlexContainerEntity.class)
	@JoinTable(
			name=DBEntities.FCNT_CNTCHILD_JOIN,
			inverseJoinColumns={@JoinColumn(name=DBEntities.FCNT_JOIN_ID, referencedColumnName=ShortName.RESOURCE_ID)},
			joinColumns={@JoinColumn(name=DBEntities.CNT_JOIN_ID, referencedColumnName=ShortName.RESOURCE_ID)}
			)
	protected FlexContainerEntity parentFlexContainer;
	
	// Database link to the possible parent Application Entity
	@ManyToOne(fetch=FetchType.LAZY, targetEntity=AeEntity.class)
	@JoinTable(
			name = DBEntities.AECNTCHILD_JOIN,
			inverseJoinColumns = { @JoinColumn(name = DBEntities.AE_JOINID, referencedColumnName = ShortName.RESOURCE_ID) }, 
			joinColumns = { @JoinColumn(name = DBEntities.CNT_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }
			)
	protected AeEntity parentAE;

	// Database link to the possible parent CSEBase Entity
	@ManyToOne(fetch=FetchType.LAZY, targetEntity=CSEBaseEntity.class)
	@JoinTable(
			name=DBEntities.CSEB_CNT_JOIN,
			inverseJoinColumns={@JoinColumn(name=DBEntities.CSEB_JOIN_ID, referencedColumnName=ShortName.RESOURCE_ID)},
			joinColumns={@JoinColumn(name=DBEntities.CNT_JOIN_ID, referencedColumnName=ShortName.RESOURCE_ID)}
			)
	protected CSEBaseEntity parentCSEB;
	
	// Database link to the possible parent remote cse Entity
	@ManyToOne(fetch=FetchType.LAZY, targetEntity=RemoteCSEEntity.class)
	@JoinTable(
			name=DBEntities.CSRCNTCHILD_JOIN,
			inverseJoinColumns={@JoinColumn(name=DBEntities.CSR_JOIN_ID, referencedColumnName=ShortName.RESOURCE_ID)},
			joinColumns={@JoinColumn(name=DBEntities.CNT_JOIN_ID, referencedColumnName=ShortName.RESOURCE_ID)}
			)
	
	
	public BigInteger getCurrentNrOfInstances() {
			return currentNrOfInstances;
	}

	public void setCurrentNrOfInstances(BigInteger currentNrOfInstances) {
			this.currentNrOfInstances = currentNrOfInstances;
	}
	
	protected RemoteCSEEntity parentCSR;
	
	/**
	 * @return the parentContainer
	 */
	public ContainerEntity getParentContainer() {
		return parentContainer;
	}

	/**
	 * @param parentContainer the parentContainer to set
	 */
	public void setParentContainer(ContainerEntity parentContainer) {
		this.parentContainer = parentContainer;
	}

	/**
	 * @return the parentAE
	 */
	public AeEntity getParentAE() {
		return parentAE;
	}

	/**
	 * @param parentAE the parentAE to set
	 */
	public void setParentAE(AeEntity parentAE) {
		this.parentAE = parentAE;
	}

	/**
	 * @return the parentCSEB
	 */
	public CSEBaseEntity getParentCSEB() {
		return parentCSEB;
	}

	/**
	 * @param parentCSEB the parentCSEB to set
	 */
	public void setParentCSEB(CSEBaseEntity parentCSEB) {
		this.parentCSEB = parentCSEB;
	}

	/**
	 * @return the stateTag
	 */
	public BigInteger getStateTag() {
		return stateTag;
	}

	/**
	 * @param stateTag the stateTag to set
	 */
	public void setStateTag(BigInteger stateTag) {
		this.stateTag = stateTag;
	}

	/**
	 * @return the creator
	 */
	public String getCreator() {
		return creator;
	}

	/**
	 * @param creator the creator to set
	 */
	public void setCreator(String creator) {
		this.creator = creator;
	}

	/**
	 * @return the maxNrOfInstances
	 */
	public BigInteger getMaxNrOfInstances() {
		return maxNrOfInstances;
	}

	/**
	 * @param maxNrOfInstances the maxNrOfInstances to set
	 */
	public void setMaxNrOfInstances(BigInteger maxNrOfInstances) {
		this.maxNrOfInstances = maxNrOfInstances;
	}

	/**
	 * @return the maxByteSize
	 */
	public BigInteger getMaxByteSize() {
		return maxByteSize;
	}

	/**
	 * @param maxByteSize the maxByteSize to set
	 */
	public void setMaxByteSize(BigInteger maxByteSize) {
		this.maxByteSize = maxByteSize;
	}

	/**
	 * @return the maxInstanceAge
	 */
	public BigInteger getMaxInstanceAge() {
		return maxInstanceAge;
	}

	/**
	 * @param maxInstanceAge the maxInstanceAge to set
	 */
	public void setMaxInstanceAge(BigInteger maxInstanceAge) {
		this.maxInstanceAge = maxInstanceAge;
	}

	/**
	 * @return the locationID
	 */
	public String getLocationID() {
		return locationID;
	}

	/**
	 * @param locationID the locationID to set
	 */
	public void setLocationID(String locationID) {
		this.locationID = locationID;
	}

	/**
	 * @return the ontologyRef
	 */
	public String getOntologyRef() {
		return ontologyRef;
	}

	/**
	 * @param ontologyRef the ontologyRef to set
	 */
	public void setOntologyRef(String ontologyRef) {
		this.ontologyRef = ontologyRef;
	}

	/**
	 * @return the childContainers
	 */
	public List<ContainerEntity> getChildContainers() {
		if (this.childContainers == null) {
			this.childContainers = new ArrayList<>();
		}
		return childContainers;
	}

	/**
	 * @param childContainers the childContainers to set
	 */
	public void setChildContainers(List<ContainerEntity> childContainers) {
		this.childContainers = childContainers;
	}
	
	/**
	 * @return the childFlexContainers
	 */
	public List<FlexContainerEntity> getChildFlexContainers() {
		if (this.childFlexContainers == null) {
			this.childFlexContainers = new ArrayList<>();
		}
		return childFlexContainers;
	}

	/**
	 * @param childFlexContainers the childFlexContainers to set
	 */
	public void setChildFlexContainers(List<FlexContainerEntity> childFlexContainers) {
		this.childFlexContainers = childFlexContainers;
	}

	/**
	 * @return the accessControlPolicies
	 */
	public List<AccessControlPolicyEntity> getAccessControlPolicies() {
		if (accessControlPolicies == null) {
			accessControlPolicies = new ArrayList<>();
		}
		return accessControlPolicies;
	}

	/**
	 * @param accessControlPolicies the accessControlPolicies to set
	 */
	public void setAccessControlPolicies(
			List<AccessControlPolicyEntity> accessControlPolicies) {
		this.accessControlPolicies = accessControlPolicies;
	}

	/**
	 * @return the childContentInstances
	 */
	public List<ContentInstanceEntity> getChildContentInstances() {
		if (childContentInstances == null) {
			this.childContentInstances = new ArrayList<>();
		}
		return childContentInstances;
	}

	/**
	 * @param childContentInstances the childContentInstances to set
	 */
	public void setChildContentInstances(
			List<ContentInstanceEntity> childContentInstances) {
		this.childContentInstances = childContentInstances;
	}

	/**
	 * @return the parentCSR
	 */
	public RemoteCSEEntity getParentCSR() {
		return parentCSR;
	}

	/**
	 * @param parentCSR the parentCSR to set
	 */
	public void setParentCSR(RemoteCSEEntity parentCSR) {
		this.parentCSR = parentCSR;
	}

	/**
	 * @return the subscriptions
	 */
	public List<SubscriptionEntity> getSubscriptions() {
		if (this.subscriptions == null) {
			this.subscriptions = new ArrayList<>();
		}
		return subscriptions;
	}

	/**
	 * @param subscriptions the subscriptions to set
	 */
	public void setSubscriptions(List<SubscriptionEntity> subscriptions) {
		this.subscriptions = subscriptions;
	}
	
	@Override
	/**
	 * Retrieve linked dynamicAuthorizationConsultations
	 */
	public List<DynamicAuthorizationConsultationEntity> getDynamicAuthorizationConsultations() {
		if (dynamicAuthorizationConsultations == null) {
			dynamicAuthorizationConsultations = new ArrayList<>();
		}
		return dynamicAuthorizationConsultations;
	}
	
	@Override
	/**
	 * Set linked dynamicAuthorizationConsultations
	 */
	public void setDynamicAuthorizationConsultations(List<DynamicAuthorizationConsultationEntity> list) {
		this.dynamicAuthorizationConsultations = list;
	}
	
	/**
	 * Return the current byte size of summed content instance content size in bytes
	 * @return
	 */
	public int getCurrentByteSize() {
		int result = 0;
		for (ContentInstanceEntity cin : this.getChildContentInstances()) {
			result += cin.getByteSize();
		}
		return result;
	}

}
