/*
IRC plugin for Miranda IM

Copyright (C) 2003-05 Jurgen Persson
Copyright (C) 2007-09 George Hazan

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/

#include "irc.h"

/////////////////////////////////////////////////////////////////////////////////////////
// 'User details' dialog

struct UserDetailsDlgProcParam
{
	UserDetailsDlgProcParam( CIrcProto* _pro, HANDLE _info ) :
		ppro( _pro ),
		hContact( _info )
	{}

	CIrcProto* ppro;
	HANDLE hContact;
};

#define STR_BASIC "Faster! Searches the network for an exact match of the nickname only. The hostmask is optional and provides further security if used. Wildcards (? and *) are allowed."
#define STR_ADVANCED "Slower! Searches the network for nicknames matching a wildcard string. The hostmask is mandatory and a minimum of 4 characters is necessary in the \"Nick\" field. Wildcards (? and *) are allowed."
#define STR_ERROR "Settings could not be saved!\n\nThe \"Nick\" field must contain at least four characters including wildcards,\n and it must also match the default nickname for this contact."
#define STR_ERROR2 "Settings could not be saved!\n\nA full hostmask must be set for this online detection mode to work."

INT_PTR CALLBACK UserDetailsDlgProc(HWND m_hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	UserDetailsDlgProcParam* p = ( UserDetailsDlgProcParam* )GetWindowLongPtr( m_hwnd, GWLP_USERDATA );
	switch (msg) {
	case WM_INITDIALOG:
		p = new UserDetailsDlgProcParam( NULL, ( HANDLE )lParam );
		SetWindowLongPtr( m_hwnd, GWLP_USERDATA, ( LPARAM )p );
		break;

	case WM_NOTIFY:
		if ((( LPNMHDR )lParam )->idFrom == 0 && (( LPNMHDR )lParam )->code == PSN_PARAMCHANGED ) {
			p->ppro = ( CIrcProto* )(( PSHNOTIFY* )lParam )->lParam;

			DBVARIANT dbv;
			BYTE bAdvanced = p->ppro->getByte( p->hContact, "AdvancedMode", 0);

			TranslateDialogDefault( m_hwnd);

			CheckDlgButton( m_hwnd, IDC_RADIO1, bAdvanced?BST_UNCHECKED:BST_CHECKED);
			CheckDlgButton( m_hwnd, IDC_RADIO2, bAdvanced?BST_CHECKED:BST_UNCHECKED);
			EnableWindow(GetDlgItem( m_hwnd, IDC_WILDCARD), bAdvanced);

			if ( !bAdvanced ) {
				SetDlgItemText( m_hwnd, IDC_DEFAULT, TranslateT(STR_BASIC));
				if ( !p->ppro->getTString( p->hContact, "Default", &dbv)) {
					SetDlgItemText( m_hwnd, IDC_WILDCARD, dbv.ptszVal);
					DBFreeVariant(&dbv);
				}
			}
			else {
				SetDlgItemText( m_hwnd, IDC_DEFAULT, TranslateT(STR_ADVANCED));
				if ( !p->ppro->getTString( p->hContact, "UWildcard", &dbv)) {
					SetDlgItemText( m_hwnd, IDC_WILDCARD, dbv.ptszVal);
					DBFreeVariant(&dbv);
			}	}

			if ( !p->ppro->getTString( p->hContact, "UUser", &dbv)) {
				SetDlgItemText( m_hwnd, IDC_USER, dbv.ptszVal);
				DBFreeVariant(&dbv);
			}

			if ( !p->ppro->getTString( p->hContact, "UHost", &dbv)) {
				SetDlgItemText( m_hwnd, IDC_HOST, dbv.ptszVal);
				DBFreeVariant(&dbv);
			}
			ProtoBroadcastAck(p->ppro->m_szModuleName, p->hContact, ACKTYPE_GETINFO, ACKRESULT_SUCCESS, (HANDLE) 1, 0);
		}
		break;

	case WM_COMMAND:
		if (( LOWORD(wParam) == IDC_WILDCARD || LOWORD(wParam) == IDC_USER || LOWORD(wParam) == IDC_HOST ) &&
			 ( HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus()))
			return true;

		EnableWindow(GetDlgItem( m_hwnd, IDC_BUTTON), true);
		EnableWindow(GetDlgItem( m_hwnd, IDC_BUTTON2), true);

		if( HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDC_BUTTON ) {
			TCHAR temp[500];
			GetDlgItemText( m_hwnd, IDC_WILDCARD, temp, SIZEOF(temp));
			DBVARIANT dbv;

			BYTE bAdvanced = IsDlgButtonChecked( m_hwnd, IDC_RADIO1)?0:1;
			if ( bAdvanced ) {
				if ( GetWindowTextLength(GetDlgItem( m_hwnd, IDC_WILDCARD)) == 0 ||
					  GetWindowTextLength(GetDlgItem( m_hwnd, IDC_USER)) == 0 ||
					  GetWindowTextLength(GetDlgItem( m_hwnd, IDC_HOST)) == 0)
				{
					MessageBox( NULL, TranslateT(STR_ERROR2), TranslateT("IRC error"), MB_OK|MB_ICONERROR);
					return FALSE;
				}

				if ( !p->ppro->getTString( p->hContact, "Default", &dbv )) {
					CMString S = _T(STR_ERROR);
					S += _T(" (");
					S += dbv.ptszVal;
					S += _T(")");
					if (( lstrlen(temp) < 4 && lstrlen(temp)) || !WCCmp(CharLower(temp), CharLower(dbv.ptszVal))) {
						MessageBox( NULL, TranslateTS( S.c_str()), TranslateT( "IRC error" ), MB_OK | MB_ICONERROR );
						DBFreeVariant( &dbv );
						return FALSE;
					}
					DBFreeVariant( &dbv );
				}

				GetDlgItemText( m_hwnd, IDC_WILDCARD, temp, SIZEOF(temp));
				if ( lstrlen( GetWord(temp, 0).c_str()))
					p->ppro->setTString( p->hContact, "UWildcard", GetWord(temp, 0).c_str());
				else
					DBDeleteContactSetting( p->hContact, p->ppro->m_szModuleName, "UWildcard");
			}

			p->ppro->setByte( p->hContact, "AdvancedMode", bAdvanced);

			GetDlgItemText( m_hwnd, IDC_USER, temp, SIZEOF(temp));
			if (lstrlen(GetWord(temp, 0).c_str()))
				p->ppro->setTString( p->hContact, "UUser", GetWord(temp, 0).c_str());
			else
				DBDeleteContactSetting( p->hContact, p->ppro->m_szModuleName, "UUser");

			GetDlgItemText( m_hwnd, IDC_HOST, temp, SIZEOF(temp));
			if (lstrlen(GetWord(temp, 0).c_str()))
				p->ppro->setTString( p->hContact, "UHost", GetWord(temp, 0).c_str());
			else
				DBDeleteContactSetting( p->hContact, p->ppro->m_szModuleName, "UHost");

			EnableWindow(GetDlgItem( m_hwnd, IDC_BUTTON), FALSE);
		}

		if ( HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDC_BUTTON2 ) {
			if ( IsDlgButtonChecked( m_hwnd, IDC_RADIO2 ))
				SetDlgItemTextA( m_hwnd, IDC_WILDCARD, "");
			SetDlgItemTextA( m_hwnd, IDC_HOST, "" );
			SetDlgItemTextA( m_hwnd, IDC_USER, "" );
			DBDeleteContactSetting( p->hContact, p->ppro->m_szModuleName, "UWildcard");
			DBDeleteContactSetting( p->hContact, p->ppro->m_szModuleName, "UUser");
			DBDeleteContactSetting( p->hContact, p->ppro->m_szModuleName, "UHost");
			EnableWindow(GetDlgItem( m_hwnd, IDC_BUTTON), FALSE );
			EnableWindow(GetDlgItem( m_hwnd, IDC_BUTTON2), FALSE );
		}

		if ( HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDC_RADIO1 ) {
			SetDlgItemText( m_hwnd, IDC_DEFAULT, TranslateT(STR_BASIC));

			DBVARIANT dbv;
			if ( !p->ppro->getTString( p->hContact, "Default", &dbv )) {
				SetDlgItemText( m_hwnd, IDC_WILDCARD, dbv.ptszVal );
				DBFreeVariant( &dbv );
			}
			EnableWindow(GetDlgItem( m_hwnd, IDC_WILDCARD), FALSE );
		}

		if ( HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDC_RADIO2 ) {
			DBVARIANT dbv;
			SetDlgItemText( m_hwnd, IDC_DEFAULT, TranslateT(STR_ADVANCED));
			if ( !p->ppro->getTString( p->hContact, "UWildcard", &dbv )) {
				SetDlgItemText( m_hwnd, IDC_WILDCARD, dbv.ptszVal );
				DBFreeVariant( &dbv );
			}
			EnableWindow(GetDlgItem( m_hwnd, IDC_WILDCARD), true);
		}
		break;
	}
	return FALSE;
}

int __cdecl CIrcProto::OnInitUserInfo(WPARAM wParam, LPARAM lParam)
{
	char* szProto = ( char* )CallService( MS_PROTO_GETCONTACTBASEPROTO, lParam, 0);
	HANDLE hContact = (HANDLE) lParam;
	if ( !hContact || !szProto || lstrcmpiA( szProto, m_szModuleName ))
		return 0;

	if ( getByte( hContact, "ChatRoom", 0 ) != 0 )
		return 0;

	if ( getByte( hContact, "DCC", 0 ) != 0 )
		return 0;

	DBVARIANT dbv;
	if ( !getTString( hContact, "Default", &dbv )) {
		if ( IsChannel( dbv.ptszVal )) {
			DBFreeVariant( &dbv );
			return 0;
		}
		DBFreeVariant(&dbv);
	}

	OPTIONSDIALOGPAGE odp = { 0 };
	odp.cbSize = sizeof(odp);
	odp.flags = ODPF_DONTTRANSLATE;
	odp.pszTitle = m_szModuleName;
	odp.hIcon = NULL;
	odp.dwInitParam = ( LPARAM )this;
	odp.hInstance = hInst;
	odp.position = -1900000000;
	odp.pfnDlgProc = UserDetailsDlgProc;
	odp.pszTemplate = MAKEINTRESOURCEA(IDD_USERINFO);
	odp.pszTitle = m_szModuleName;
	CallService( MS_USERINFO_ADDPAGE, wParam, (LPARAM) & odp);
	return 0;
}
