/*
 * 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.openmeetings.db.entity.room;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

import org.apache.openmeetings.db.entity.IDataProviderEntity;
import org.apache.openmeetings.db.entity.server.Server;
import org.apache.openmeetings.util.CalendarPatterns;

/**
 * Can be configured to be stored in memory or in database
 * 
 * @author sebawagner
 */
@Entity
@NamedQueries({
	@NamedQuery(name = "deleteAll", query = "DELETE FROM Client"),
	@NamedQuery(name = "deletedById", query = "DELETE FROM Client c WHERE c.id = :id"),
	@NamedQuery(name = "deleteClientsByServer", query = "DELETE FROM Client c WHERE c.server = :server"),
	@NamedQuery(name = "deletedByServerAndStreamId", query = "DELETE FROM Client c WHERE c.server = :server AND c.streamid LIKE :streamid"),
	@NamedQuery(name = "countClients", query = "SELECT count(c.id) FROM Client c"),
	@NamedQuery(name = "countClientsByServer", query = "SELECT count(c.id) FROM Client c WHERE c.server = :server"),
	@NamedQuery(name = "countClientsByServerAndStreamId", query = "SELECT count(c.id) FROM Client c WHERE c.streamid LIKE :streamid AND c.server = :server"),
	@NamedQuery(name = "getClientByServerAndStreamId", query = "SELECT c FROM Client c WHERE c.streamid LIKE :streamid AND c.server = :server"),
	@NamedQuery(name = "getClientsByPublicSIDAndServer", query = "SELECT c FROM Client c WHERE c.publicSID LIKE :publicSID AND c.server = :server"),
	@NamedQuery(name = "getClientsByPublicSID", query = "SELECT c FROM Client c WHERE c.publicSID LIKE :publicSID"),
	@NamedQuery(name = "getClientsByServer", query = "SELECT c FROM Client c WHERE c.server = :server"),
	@NamedQuery(name = "getClients", query = "SELECT c FROM Client c"),
	@NamedQuery(name = "getClientsWithServer", query = "SELECT c FROM Client c LEFT JOIN FETCH c.server"),
	@NamedQuery(name = "getClientsByUserId", query = "SELECT c FROM Client c WHERE c.server = :server AND c.user_id = :user_id"),
	@NamedQuery(name = "getClientsByRoomId", query = "SELECT c FROM Client c WHERE c.room_id = :room_id"),
	@NamedQuery(name = "getRoomsIdsByServer", query = "SELECT c.room_id FROM Client c WHERE c.server = :server GROUP BY c.room_id")
})
@Table(name = "client")
public class Client implements IDataProviderEntity, Serializable {
	private static final long serialVersionUID = -5980636447877077730L;
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id")
	private long id;
	
	/**
	 * @see Client#getUsername()
	 */
	@Column(name = "username")
	private String username = "";
	
	/**
	 * @see Client#getStreamid()
	 */
	@Column(name = "streamid")
	private String streamid = "";
	
	/**
	 * @see Client#getScope()
	 */
	@Column(name = "scope")
	private String scope = "";
	
	/**
	 * @see Client#getVWidth()
	 */
	@Column(name = "vwidth")
	private int vWidth = 0;
	
	/**
	 * @see Client#getVHeight()
	 */
	@Column(name = "vheight")
	private int vHeight = 0;
	
	/**
	 * @see Client#getVX()
	 */
	@Column(name = "vx")
	private int vX = 0;
	
	/**
	 * @see Client#getVY()
	 */
	@Column(name = "vy")
	private int vY = 0;
	
	/**
	 * @see Client#getStreamPublishName()
	 */
	@Column(name = "stream_publish_name")
	private String streamPublishName = "";
	
	/**
	 * @see Client#getPublicSID()
	 */
	@Column(name = "public_sid")
	private String publicSID = "";
	
	/**
	 * @see Client#getIsMod()
	 */
	@Column(name = "is_mod")
	private Boolean isMod = false;
	
	/**
	 * @see Client#getIsSuperModerator()
	 */
	@Column(name = "is_supermoderator")
	private Boolean isSuperModerator = false;
	
	/**
	 * @see Client#getCanDraw()
	 */
	@Column(name = "can_draw")
	private Boolean canDraw = false;
	
	/**
	 * @see Client#getCanShare()
	 */
	@Column(name = "can_share")
	private Boolean canShare = false;
	
	/**
	 * @see Client#getCanRemote()
	 */
	@Column(name = "can_remote")
	private Boolean canRemote = false;
	
	/**
	 * @see Client#getCanGiveAudio()
	 */
	@Column(name = "can_giveaudio")
	private Boolean canGiveAudio = false;
	
	/**
	 * @see Client#getConnectedSince()
	 */
	@Column(name = "connected_since")
	private Date connectedSince;
	
	/**
	 * @see Client#getFormatedDate()
	 */
	@Column(name = "formated_date")
	private String formatedDate;
	
	/**
	 * @see Client#getIsScreenClient()
	 */
	@Column(name = "is_screenclient")
	private Boolean isScreenClient = false;
	
	/**
	 * @see Client#getIsAVClient()
	 */
	@Column(name = "is_avclient")
	private boolean isAVClient = false;
	
	/**
	 * @see Client#getUsercolor()
	 */
	@Column(name = "usercolor")
	private String usercolor;
	
	/**
	 * @see Client#getUserpos()
	 */
	@Column(name = "userpos")
	private Integer userpos;
	
	/**
	 * @see Client#getUserip()
	 */
	@Column(name = "userip")
	private String userip;
	
	/**
	 * @see Client#getUserport()
	 */
	@Column(name = "userport")
	private int userport;
	
	/**
	 * @see Client#getRoom_id()
	 */
	@Column(name = "room_id")
	private Long room_id;
	
	/**
	 * @see Client#getRoomEnter()
	 */
	@Column(name = "room_enter")
	private Date roomEnter = null;
	
	/**
	 * @see Client#getBroadCastID()
	 */
	@Column(name = "broadcast_id")
	private long broadCastID = -2;
	
	/**
	 * @see Client#getUser_id()
	 */
	@Column(name = "user_id")
	private Long user_id = null;
	
	/**
	 * @see Client#getFirstname()
	 */
	@Column(name = "firstname")
	private String firstname = "";
	
	/**
	 * @see Client#getLastname()
	 */
	@Column(name = "lastname")
	private String lastname = "";
	
	/**
	 * @see Client#getMail()
	 */
	@Column(name = "email")
	private String email;
	
	/**
	 * @see Client#getLastLogin()
	 */
	@Column(name = "last_login")
	private String lastLogin;
	
	/**
	 * @see Client#getOfficial_code()
	 */
	@Column(name = "official_code")
	private String official_code;
	
	/**
	 * @see Client#getPicture_uri()
	 */
	@Column(name = "picture_uri")
	private String picture_uri;
	
	/**
	 * @see Client#getLanguage()
	 */
	@Column(name = "language")
	private String language = "";
	
	/**
	 * @see Client#getAvsettings()
	 */
	@Column(name = "avsettings")
	private String avsettings = "";
	
	/**
	 * @see Client#getSwfurl()
	 */
	// FIXME: Move to {@link ClientSession}
	@Column(name = "swfurl")
	private String swfurl;
	
	/**
	 * @see Client#getIsRecording()
	 */
	@Column(name = "is_recording")
	private Boolean isRecording = false;
	
	/**
	 * @see Client#getRoomRecordingName()
	 */
	@Column(name = "room_recording_name")
	private String roomRecordingName;
	
	/**
	 * @see Client#getFlvRecordingId()
	 */
	@Column(name = "flvrecording_id")
	private Long flvRecordingId;
	
	/**
	 * @see Client#getFlvRecordingMetaDataId()
	 */
	@Column(name = "flvrecordingmetadata_id")
	private Long flvRecordingMetaDataId;
	
	/**
	 * @see Client#getOrganization_id()
	 */
	@Column(name = "organization_id")
	private Long organization_id;
	
	/**
	 * @see Client#isStartRecording()
	 */
	@Column(name = "start_recording")
	private boolean startRecording = false;
	
	/**
	 * @see Client#isStartStreaming()
	 */
	@Column(name = "start_streaming")
	private boolean startStreaming = false;
	
	/**
	 * @see Client#isScreenPublishStarted()
	 */
	@Column(name = "screen_publish_started")
	private boolean screenPublishStarted = false;
	
	/**
	 * @see Client#isStreamPublishStarted()
	 */
	@Column(name = "stream_publish_started")
	private boolean streamPublishStarted = false;
	
	/**
	 * @see Client#getIsBroadcasting()
	 */
	@Column(name = "is_broadcasting")
	private Boolean isBroadcasting = false;
	
	/**
	 * @see Client#getExternalUserId()
	 */
	@Column(name = "external_user_id")
	private String externalUserId;
	
	/**
	 * @see Client#getExternalUserType()
	 */
	@Column(name = "external_user_type")
	private String externalUserType;
	
	/**
	 * @see Client#getInterviewPodId()
	 */
	@Column(name = "interview_pod_id")
	private Integer interviewPodId = null;
	
	/**
	 * @see Client#isAllowRecording()
	 */
	@Column(name = "allow_recording")
	private boolean allowRecording = true;
	
	/**
	 * @see Client#getZombieCheckFlag()
	 */
	@Column(name = "zombie_check_flag")
	private Boolean zombieCheckFlag = false;
	
	/**
	 * @see Client#getMicMuted()
	 */
	@Column(name = "mic_muted")
	private Boolean micMuted = false;
	
	/**
	 * @see Client#isSipTransport()
	 */
	@Column(name = "sip_transport")
	private boolean sipTransport = false;
	
	@Column(name = "mobile")
	private boolean mobile = false;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "server_id")
	private Server server;
    
	public Client() {}
    
	public Client(String streamid, String publicSID, Long room_id,
			Long user_id, String firstname, String lastname, boolean isAVClient,
			String username, String connectedSince, String scope) {
		super();
		this.streamid = streamid;
		this.publicSID = publicSID;
		this.room_id = room_id;
		this.user_id = user_id;
		this.firstname = firstname;
		this.lastname = lastname;
		this.isAVClient = isAVClient;
		this.username = username;
		this.connectedSince = CalendarPatterns.parseDateWithHour(connectedSince);
		this.scope = scope;
	}

	public void setUserObject(Long user_id, String username, String firstname, String lastname) {
		this.user_id = user_id;
		this.username = username;
		this.firstname = firstname;
		this.lastname = lastname;
	}

	public void setUserObject(String username, String firstname, String lastname) {
		this.username = username;
		this.firstname = firstname;
		this.lastname = lastname;
	}
	
	public long getId() {
		return id;
	}

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

	public Date getConnectedSince() {
		return connectedSince;
	}

	public void setConnectedSince(Date connectedSince) {
		this.connectedSince = connectedSince;
	}

	public Boolean getIsMod() {
		return isMod;
	}

	public void setIsMod(Boolean isMod) {
		this.isMod = isMod;
	}
	
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getStreamid() {
		return streamid;
	}

	public void setStreamid(String streamid) {
		this.streamid = streamid;
	}

	public String getScope() {
		return scope;
	}

	public void setScope(String scope) {
		this.scope = scope;
	}

	public String getFormatedDate() {
		return formatedDate;
	}

	public void setFormatedDate(String formatedDate) {
		this.formatedDate = formatedDate;
	}

	public String getUsercolor() {
		return usercolor;
	}

	public void setUsercolor(String usercolor) {
		this.usercolor = usercolor;
	}

	public Integer getUserpos() {
		return userpos;
	}

	public void setUserpos(Integer userpos) {
		this.userpos = userpos;
	}

	public String getUserip() {
		return userip;
	}

	public void setUserip(String userip) {
		this.userip = userip;
	}

	public String getSwfurl() {
		return swfurl;
	}

	public void setSwfurl(String swfurl) {
		this.swfurl = swfurl;
	}

	public int getUserport() {
		return userport;
	}

	public void setUserport(int userport) {
		this.userport = userport;
	}

	public String getFirstname() {
		return firstname;
	}

	public void setFirstname(String firstname) {
		this.firstname = firstname;
	}

	public String getLanguage() {
		return language;
	}

	public void setLanguage(String language) {
		this.language = language;
	}

	public String getLastLogin() {
		return lastLogin;
	}

	public void setLastLogin(String lastLogin) {
		this.lastLogin = lastLogin;
	}

	public String getLastname() {
		return lastname;
	}

	public void setLastname(String lastname) {
		this.lastname = lastname;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getOfficial_code() {
		return official_code;
	}

	public void setOfficial_code(String official_code) {
		this.official_code = official_code;
	}

	public String getPicture_uri() {
		return picture_uri;
	}

	public void setPicture_uri(String picture_uri) {
		this.picture_uri = picture_uri;
	}

	public Long getUser_id() {
		return user_id;
	}

	public void setUser_id(Long user_id) {
		this.user_id = user_id;
	}

	public Long getRoom_id() {
		return room_id;
	}

	public void setRoom_id(Long room_id) {
		this.room_id = room_id;
	}

	public Date getRoomEnter() {
		return roomEnter;
	}

	public void setRoomEnter(Date roomEnter) {
		this.roomEnter = roomEnter;
	}

	public Boolean getIsRecording() {
		return isRecording;
	}

	public void setIsRecording(Boolean isRecording) {
		this.isRecording = isRecording;
	}

	public String getRoomRecordingName() {
		return roomRecordingName;
	}

	public void setRoomRecordingName(String roomRecordingName) {
		this.roomRecordingName = roomRecordingName;
	}

	public String getAvsettings() {
		return avsettings;
	}

	public void setAvsettings(String avsettings) {
		this.avsettings = avsettings;
	}

	public long getBroadCastID() {
		return broadCastID;
	}

	public void setBroadCastID(long broadCastID) {
		this.broadCastID = broadCastID;
	}

	public String getPublicSID() {
		return publicSID;
	}
	
	public void setPublicSID(String publicSID) {
		this.publicSID = publicSID;
	}

	public Boolean getZombieCheckFlag() {
		return zombieCheckFlag;
	}
	
	public void setZombieCheckFlag(Boolean zombieCheckFlag) {
		this.zombieCheckFlag = zombieCheckFlag;
	}

	public Boolean getMicMuted() {
		return micMuted;
	}

	public void setMicMuted(Boolean micMuted) {
		this.micMuted = micMuted;
	}

	public Boolean getCanDraw() {
		return canDraw;
	}

	public void setCanDraw(Boolean canDraw) {
		this.canDraw = canDraw;
	}

	public Boolean getIsBroadcasting() {
		return isBroadcasting;
	}

	public void setIsBroadcasting(Boolean isBroadcasting) {
		this.isBroadcasting = isBroadcasting;
	}

	public Boolean getCanShare() {
		return canShare;
	}

	public void setCanShare(Boolean canShare) {
		this.canShare = canShare;
	}

	public String getExternalUserId() {
		return externalUserId;
	}

	public void setExternalUserId(String externalUserId) {
		this.externalUserId = externalUserId;
	}

	public String getExternalUserType() {
		return externalUserType;
	}

	public void setExternalUserType(String externalUserType) {
		this.externalUserType = externalUserType;
	}

	public Boolean getIsSuperModerator() {
		return isSuperModerator;
	}

	public void setIsSuperModerator(Boolean isSuperModerator) {
		this.isSuperModerator = isSuperModerator;
	}

	public Boolean getIsScreenClient() {
		return isScreenClient;
	}

	public void setIsScreenClient(Boolean isScreenClient) {
		this.isScreenClient = isScreenClient;
	}

	public int getVWidth() {
		return vWidth;
	}

	public void setVWidth(int width) {
		vWidth = width;
	}

	public int getVHeight() {
		return vHeight;
	}

	public void setVHeight(int height) {
		vHeight = height;
	}

	public int getVX() {
		return vX;
	}

	public void setVX(int vx) {
		vX = vx;
	}

	public int getVY() {
		return vY;
	}

	public void setVY(int vy) {
		vY = vy;
	}

	public String getStreamPublishName() {
		return streamPublishName;
	}

	public void setStreamPublishName(String streamPublishName) {
		this.streamPublishName = streamPublishName;
	}

	public Long getFlvRecordingId() {
		return flvRecordingId;
	}

	public void setFlvRecordingId(Long flvRecordingId) {
		this.flvRecordingId = flvRecordingId;
	}

	public Long getFlvRecordingMetaDataId() {
		return flvRecordingMetaDataId;
	}

	public void setFlvRecordingMetaDataId(Long flvRecordingMetaDataId) {
		this.flvRecordingMetaDataId = flvRecordingMetaDataId;
	}

	public boolean isScreenPublishStarted() {
		return screenPublishStarted;
	}

	public void setScreenPublishStarted(boolean screenPublishStarted) {
		this.screenPublishStarted = screenPublishStarted;
	}

	public Long getOrganization_id() {
		return organization_id;
	}

	public void setOrganization_id(Long organization_id) {
		this.organization_id = organization_id;
	}

	public boolean isStartRecording() {
		return startRecording;
	}

	public void setStartRecording(boolean startRecording) {
		this.startRecording = startRecording;
	}

	public boolean isStartStreaming() {
		return startStreaming;
	}

	public void setStartStreaming(boolean startStreaming) {
		this.startStreaming = startStreaming;
	}

	public Integer getInterviewPodId() {
		return interviewPodId;
	}

	public void setInterviewPodId(Integer interviewPodId) {
		this.interviewPodId = interviewPodId;
	}

	public Boolean getCanRemote() {
		return canRemote;
	}

	public void setCanRemote(Boolean canRemote) {
		this.canRemote = canRemote;
	}

	public Boolean getCanGiveAudio() {
		return canGiveAudio;
	}

	public void setCanGiveAudio(Boolean canGiveAudio) {
		this.canGiveAudio = canGiveAudio;
	}

	public boolean isAllowRecording() {
		return allowRecording;
	}

	public void setAllowRecording(boolean allowRecording) {
		this.allowRecording = allowRecording;
	}

	public boolean getIsAVClient() {
		return isAVClient;
	}

	public void setIsAVClient(boolean isAVClient) {
		this.isAVClient = isAVClient;
	}

	public boolean isStreamPublishStarted() {
		return streamPublishStarted;
	}

	public void setStreamPublishStarted(boolean streamPublishStarted) {
		this.streamPublishStarted = streamPublishStarted;
	}

	public boolean isSipTransport() {
		return sipTransport;
	}

	public void setSipTransport(boolean sipTransport) {
		this.sipTransport = sipTransport;
	}
	
	public Server getServer() {
		return server;
	}

	public void setServer(Server server) {
		this.server = server;
	}

	public boolean isMobile() {
		return mobile;
	}

	public void setMobile(boolean mobile) {
		this.mobile = mobile;
	}

	@Override
	public String toString() {
		return "Client [streamid=" + streamid + ", publicSID=" + publicSID + ", isScreenClient=" + isScreenClient
				+ ", isAVClient=" + isAVClient + ", isMobile = " + mobile + ", room_id=" + room_id + ", broadCastID=" + broadCastID + ", user_id="
				+ user_id + ", avsettings=" + avsettings + ", isRecording=" + isRecording + ", flvRecordingId="
				+ flvRecordingId + ", flvRecordingMetaDataId=" + flvRecordingMetaDataId + ", screenPublishStarted="
				+ screenPublishStarted + ", interviewPodId=" + interviewPodId + ", server=" + server + "]";
	}
}
