//========= Copyright © 1996-2003, Valve LLC, All rights reserved. ============
//
// Purpose: 
//
//=============================================================================
#include "cbase.h"
#include <mx/mx.h>
#include <stdio.h>
#include "resource.h"
#include "SoundProperties_Multiple.h"
#include "soundemittersystembase.h"
#include "soundentry.h"
#include "cmdlib.h"
#include "workspacemanager.h"
#include "wavebrowser.h"
#include "wavefile.h"
#include "waveproperties.h"

static CSoundParams g_Params;

static void PopulateChannelList( HWND wnd, CSoundEmitterSystemBase::CSoundParametersInternal *p )
{
	HWND control = GetDlgItem( wnd, IDC_CHANNEL );
	if ( !control )
	{
		return;
	}

	SendMessage( control, CB_RESETCONTENT, 0, 0 ); 
	SendMessage( control, WM_SETTEXT , 0, (LPARAM)p->ChannelToString() );

	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"CHAN_VOICE" ); 

	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"CHAN_AUTO" ); 
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"CHAN_WEAPON" ); 
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"CHAN_ITEM" ); 
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"CHAN_BODY" ); 
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"CHAN_STREAM" ); 
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"CHAN_STATIC" ); 
}

static void PopulateVolumeList( HWND wnd, CSoundEmitterSystemBase::CSoundParametersInternal *p )
{
	HWND control = GetDlgItem( wnd, IDC_VOLUME );
	if ( !control )
	{
		return;
	}

	SendMessage( control, CB_RESETCONTENT, 0, 0 ); 

	SendMessage( control, WM_SETTEXT , 0, (LPARAM)p->VolumeToString() );

	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"VOL_NORM" ); 
}

static void PopulateSoundlevelList( HWND wnd, CSoundEmitterSystemBase::CSoundParametersInternal *p )
{
	HWND control = GetDlgItem( wnd, IDC_SOUNDLEVEL );
	if ( !control )
	{
		return;
	}

	SendMessage( control, CB_RESETCONTENT, 0, 0 ); 

	SendMessage( control, WM_SETTEXT , 0, (LPARAM)p->SoundLevelToString() );

	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_NORM" );
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_NONE" );
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_IDLE" );
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_TALKING" );
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_STATIC" );
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_GUNFIRE" );

	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_25dB" );
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_30dB" );
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_35dB" );
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_40dB" );
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_45dB" );
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_50dB" );
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_55dB" );
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_60dB" );
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_65dB" );
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_70dB" );
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_75dB" );
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_80dB" );
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_85dB" );
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_90dB" );
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_95dB" );
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_100dB" );
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_105dB" );
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_120dB" );
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_130dB" );
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_140dB" );
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_150dB" );
}

static void PopulatePitchList( HWND wnd, CSoundEmitterSystemBase::CSoundParametersInternal *p )
{
	HWND control = GetDlgItem( wnd, IDC_PITCH );
	if ( !control )
	{
		return;
	}

	SendMessage( control, CB_RESETCONTENT, 0, 0 ); 

	SendMessage( control, WM_SETTEXT , 0, (LPARAM)p->PitchToString() );

	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"PITCH_NORM" ); 
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"PITCH_LOW" ); 
	SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"PITCH_HIGH" ); 
}

static void SoundProperties_Multiple_OnOK( HWND hwndDlg )
{
	int c = g_Params.items.Count();
	for ( int i = 0; i < c; i++ )
	{
		// Gather info and make changes
		CSoundEntry *item = g_Params.items[ i ];
		Assert( item );
		if ( !item )
			continue;

		int idx = soundemitter->GetSoundIndex( item->GetName() );
		if ( !soundemitter->IsValidIndex( idx ) )
		{
			continue;
		}


		CSoundEmitterSystemBase::CSoundParametersInternal *baseparams = soundemitter->InternalGetParametersForSound( idx );
		if ( !baseparams )
			return;

		// Start with old settings
		CSoundEmitterSystemBase::CSoundParametersInternal outparams = *baseparams;

		char sz[ 128 ];
		GetDlgItemText( hwndDlg, IDC_CHANNEL, sz, sizeof( sz ) );
		outparams.ChannelFromString( sz );

		GetDlgItemText( hwndDlg, IDC_VOLUME, sz, sizeof( sz ) );
		outparams.VolumeFromString( sz );

		GetDlgItemText( hwndDlg, IDC_SOUNDLEVEL, sz, sizeof( sz ) );
		outparams.SoundLevelFromString( sz );

		GetDlgItemText( hwndDlg, IDC_PITCH, sz, sizeof( sz ) );
		outparams.PitchFromString( sz );

		bool owneronly = SendMessage( GetDlgItem( hwndDlg, IDC_OWNERONLY ), BM_GETCHECK, 0, 0 ) == BST_CHECKED ? true : false;

		outparams.play_to_owner_only = owneronly;

		bool noprecache = SendMessage( GetDlgItem( hwndDlg, IDC_NOPRECACHE ), BM_GETCHECK, 0, 0 ) == BST_CHECKED ? true : false;

		outparams.precache = !noprecache;

		soundemitter->UpdateSoundParameters( item->GetName(), outparams );
	}

	// Repopulate things
	GetWorkspaceManager()->RefreshBrowsers();
}

//-----------------------------------------------------------------------------
// Purpose: 
// Input  : hwndDlg - 
//			uMsg - 
//			wParam - 
//			lParam - 
// Output : static BOOL CALLBACK
//-----------------------------------------------------------------------------
static BOOL CALLBACK SoundProperties_MultipleDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
	switch(uMsg)
	{
    case WM_INITDIALOG:
		{
			g_Params.PositionSelf( hwndDlg );

			CSoundEntry *entry = g_Params.items[ 0 ];
			Assert( entry );

			CSoundEmitterSystemBase::CSoundParametersInternal *p = entry->GetSoundParameters();
			Assert( p );

			SendMessage( GetDlgItem( hwndDlg, IDC_NOPRECACHE ), BM_SETCHECK, 
				( WPARAM ) !p->precache ? BST_CHECKED : BST_UNCHECKED,
				( LPARAM )0 );

			SendMessage( GetDlgItem( hwndDlg, IDC_OWNERONLY ), BM_SETCHECK, 
				( WPARAM ) p->play_to_owner_only ? BST_CHECKED : BST_UNCHECKED,
				( LPARAM )0 );

			PopulateChannelList( hwndDlg, p );
			PopulateVolumeList( hwndDlg, p );
			PopulateSoundlevelList( hwndDlg, p );
			PopulatePitchList( hwndDlg, p );

			SetWindowText( hwndDlg, g_Params.m_szDialogTitle );

			SetFocus( GetDlgItem( hwndDlg, IDC_CHANNEL ) );
		}
		return FALSE;  
		
    case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDOK:
			{
				SoundProperties_Multiple_OnOK( hwndDlg );

				EndDialog( hwndDlg, 1 );
			}
			break;
        case IDCANCEL:
			EndDialog( hwndDlg, 0 );
			break;
		}
		return FALSE;
	}
	return FALSE;
}

//-----------------------------------------------------------------------------
// Purpose: 
// Input  : *view - 
//			*actor - 
// Output : int
//-----------------------------------------------------------------------------
int SoundProperties_Multiple( CSoundParams *params )
{
	g_Params = *params;

	int retval = DialogBox( (HINSTANCE)GetModuleHandle( 0 ), 
		MAKEINTRESOURCE( IDD_SOUNDPROPERTIES_MULTIPLE ),
		(HWND)GetWorkspaceManager()->getHandle(),
		(DLGPROC)SoundProperties_MultipleDialogProc );

	*params = g_Params;

	return retval;
}