/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.falcon.persistence;

import org.apache.falcon.entity.v0.EntityType;

import java.util.Date;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;

//SUSPEND CHECKSTYLE CHECK LineLengthCheck
/**
 * Feed SLA monitoring.
 * */
@Entity
@NamedQueries({
@NamedQuery(name = PersistenceConstants.GET_ENTITY_ALERTS, query = "select OBJECT(a) from EntitySLAAlertBean a where a.entityName = :entityName and a.entityType = :entityType"),
@NamedQuery(name = PersistenceConstants.GET_ALL_ENTITY_ALERTS, query = "OBJECT(a) from PendingInstanceBean a "),
@NamedQuery(name = PersistenceConstants.GET_SLA_HIGH_CANDIDATES, query = "select OBJECT(a) from EntitySLAAlertBean a where a.isSLALowMissed = true and a.isSLAHighMissed = false "),
    @NamedQuery(name = PersistenceConstants.UPDATE_SLA_HIGH, query = "update EntitySLAAlertBean a set a.isSLAHighMissed = true where a.entityName = :entityName and a.clusterName = :clusterName and a.nominalTime = :nominalTime and a.entityType = :entityType"),
@NamedQuery(name = PersistenceConstants.GET_ENTITY_ALERT_INSTANCE, query = "select OBJECT(a) from EntitySLAAlertBean a where a.entityName = :entityName and a.clusterName = :clusterName and a.nominalTime = :nominalTime and a.entityType = :entityType"),
 @NamedQuery(name = PersistenceConstants.DELETE_ENTITY_ALERT_INSTANCE, query = "delete from EntitySLAAlertBean a where a.entityName = :entityName and a.clusterName = :clusterName and a.nominalTime = :nominalTime and a.entityType = :entityType")
})
@Table(name = "ENTITY_SLA_ALERTS")
//RESUME CHECKSTYLE CHECK  LineLengthCheck
public class EntitySLAAlertBean {
    @NotNull
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private String id;

    @Basic
    @NotNull
    @Column(name = "entity_name")
    private String entityName;

    @Basic
    @NotNull
    @Column(name = "cluster_name")
    private String clusterName;

    public String getEntityType() {
        return entityType;
    }

    public void setEntityType(String entityType) {
        EntityType.assertSchedulable(entityType);
        this.entityType = entityType.toLowerCase();
    }

    @Basic
    @NotNull
    @Column(name = "entity_type")
    private String entityType;

    @Basic
    @NotNull
    @Column(name = "nominal_time")
    private Date nominalTime;

    @Basic
    @Column(name = "sla_low_missed")
    private Boolean isSLALowMissed = false;

    @Basic
    @Column(name = "sla_high_missed")
    private Boolean isSLAHighMissed = false;

    @Basic
    @Column(name = "sla_low_alert_sent")
    private Boolean slaLowAlertSent;


    @Basic
    @Column(name = "sla_high_alert_sent")
    private Boolean slaHighAlertSent;

    public Date getNominalTime() {
        return new Date(nominalTime.getTime());
    }

    public void setNominalTime(Date nominalTime) {
        this.nominalTime = new Date(nominalTime.getTime());
    }

    public String getId() {
        return id;
    }

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

    public String getClusterName() {
        return clusterName;
    }

    public void setClusterName(String clusterName) {
        this.clusterName = clusterName;
    }

    public String getEntityName() {
        return entityName;
    }

    public void setEntityName(String entityName) {
        this.entityName = entityName;
    }

    public Boolean getIsSLALowMissed() {
        return isSLALowMissed;
    }

    public void setIsSLALowMissed(Boolean isSLALowMissed) {
        this.isSLALowMissed = isSLALowMissed;
    }

    public Boolean getIsSLAHighMissed() {
        return isSLAHighMissed;
    }

    public void setIsSLAHighMissed(Boolean isSLAHighMissed) {
        this.isSLAHighMissed = isSLAHighMissed;
    }

    public static final String ENTITY_NAME = "entityName";

    public static final String CLUSTER_NAME = "clusterName";

    public static final String ENTITY_TYPE = "entityType";

    public static final String NOMINAL_TIME = "nominalTime";

}
