/*
 * 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 = 1L;
	
	@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;

	@Column(name = "can_video")
	private boolean canVideo = 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", length=2048)
	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 getCanVideo() {
		return canVideo;
	}

	public void setCanVideo(boolean canVideo) {
		this.canVideo = canVideo;
	}

	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 + "]";
	}
}
