type InitialState =
{
	id: string | null;
	displayName: string | null;
	displayNameSet: boolean;
	device: any | null;
	canSendMic: boolean;
	canSendWebcam: boolean;
	canChangeWebcam: boolean;
	webcamInProgress: boolean;
	shareInProgress: boolean;
	audioOnly: boolean;
	audioOnlyInProgress: boolean;
	audioMuted: boolean;
	restartIceInProgress: boolean;
};

const initialState: InitialState =
{
	id                   : null,
	displayName          : null,
	displayNameSet       : false,
	device               : null,
	canSendMic           : false,
	canSendWebcam        : false,
	canChangeWebcam      : false,
	webcamInProgress     : false,
	shareInProgress      : false,
	audioOnly            : false,
	audioOnlyInProgress  : false,
	audioMuted           : false,
	restartIceInProgress : false
};

const me = (state = initialState, action: any): any =>
{
	switch (action.type)
	{
		case 'SET_ROOM_STATE':
		{
			const roomState = action.payload.state;

			if (roomState === 'closed')
			{
				return {
					...state,
					webcamInProgress     : false,
					shareInProgress      : false,
					audioOnly            : false,
					audioOnlyInProgress  : false,
					audioMuted           : false,
					restartIceInProgress : false
				};
			}
			else
			{
				return state;
			}
		}

		case 'SET_ME':
		{
			const { peerId, displayName, displayNameSet, device } = action.payload;

			return { ...state, id: peerId, displayName, displayNameSet, device };
		}

		case 'SET_MEDIA_CAPABILITIES':
		{
			const { canSendMic, canSendWebcam } = action.payload;

			return { ...state, canSendMic, canSendWebcam };
		}

		case 'SET_CAN_CHANGE_WEBCAM':
		{
			const canChangeWebcam = action.payload;

			return { ...state, canChangeWebcam };
		}

		case 'SET_WEBCAM_IN_PROGRESS':
		{
			const { flag } = action.payload;

			return { ...state, webcamInProgress: flag };
		}

		case 'SET_SHARE_IN_PROGRESS':
		{
			const { flag } = action.payload;

			return { ...state, shareInProgress: flag };
		}

		case 'SET_DISPLAY_NAME':
		{
			let { displayName } = action.payload;

			// Be ready for undefined displayName (so keep previous one).
			if (!displayName)
				displayName = state.displayName;

			return { ...state, displayName, displayNameSet: true };
		}

		case 'SET_AUDIO_ONLY_STATE':
		{
			const { enabled } = action.payload;

			return { ...state, audioOnly: enabled };
		}

		case 'SET_AUDIO_ONLY_IN_PROGRESS':
		{
			const { flag } = action.payload;

			return { ...state, audioOnlyInProgress: flag };
		}

		case 'SET_AUDIO_MUTED_STATE':
		{
			const { enabled } = action.payload;

			return { ...state, audioMuted: enabled };
		}

		case 'SET_RESTART_ICE_IN_PROGRESS':
		{
			const { flag } = action.payload;

			return { ...state, restartIceInProgress: flag };
		}

		default:
			return state;
	}
};

export default me;
