<?php
/*

File: king-include/king-page-message.php
Description: Controller for private messaging page

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.

More about this license: LICENCE.html
 */

if ( ! defined( 'QA_VERSION' ) ) {
	// don't allow this page to be requested directly from browser
	header( 'Location: ../' );
	exit;
}

require_once QA_INCLUDE_DIR . 'king-db/selects.php';
require_once QA_INCLUDE_DIR . 'king-app/users.php';
require_once QA_INCLUDE_DIR . 'king-app/format.php';
require_once QA_INCLUDE_DIR . 'king-app/limits.php';

$handle      = qa_request_part( 1 );
$loginuserid = qa_get_logged_in_userid();
$fromhandle  = qa_get_logged_in_handle();

$qa_content = qa_content_prepare();

//	Check we have a handle, we're not using KINGMEDIA's single-sign on integration and that we're logged in

if ( QA_FINAL_EXTERNAL_USERS ) {
	qa_fatal_error( 'User accounts are handled by external code' );
}

if ( ! strlen( $handle ) ) {
	qa_redirect( 'users' );
}

if ( ! isset( $loginuserid ) ) {
	$qa_content['error'] = qa_insert_login_links( qa_lang_html( 'misc/message_must_login' ), qa_request() );

	return $qa_content;
}

if ( $handle === $fromhandle ) {
	// prevent users sending messages to themselves
	$qa_content['error'] = qa_lang_html( 'users/no_permission' );

	return $qa_content;
}

$start = qa_get_start();
//	Find the user profile and their recent private messages

list( $toaccount, $torecent, $fromrecent ) = qa_db_select_with_pending(
	qa_db_user_account_selectspec( $handle, false ),
	qa_db_recent_messages_selectspec( $loginuserid, true, $handle, false ),
	qa_db_recent_messages_selectspec( $handle, false, $loginuserid, true )
);

//	Check the user exists and work out what can and can't be set (if not using single sign-on)

if ( ! qa_opt( 'allow_private_messages' ) || ! is_array( $toaccount ) || ( $toaccount['flags'] & QA_USER_FLAGS_NO_MESSAGES ) ) {
	return include QA_INCLUDE_DIR . 'king-page-not-found.php';
}

//	Check that we have permission and haven't reached the limit, but don't quit just yet

switch ( qa_user_permit_error( null, QA_LIMIT_MESSAGES ) ) {
	case 'limit':
		$pageerror = qa_lang_html( 'misc/message_limit' );
		break;

	case false:
		break;

	default:
		$pageerror = qa_lang_html( 'users/no_permission' );
		break;
}

//	Process sending a message to user

// check for messages or errors
$state       = qa_get_state();
$messagesent = 'message-sent' == $state;

if ( qa_post_text( 'domessage' ) ) {
	$inmessage = qa_post_text( 'message' );

	if ( isset( $pageerror ) ) {
		// not permitted to post, so quit here
		$qa_content['error'] = $pageerror;

		return $qa_content;
	}

	if ( ! qa_check_form_security_code( 'message-' . $handle, qa_post_text( 'code' ) ) ) {
		$pageerror = qa_lang_html( 'misc/form_security_again' );
	} else {
		if ( empty( $inmessage ) ) {
			$errors['message'] = qa_lang( 'misc/message_empty' );
		}

		if ( empty( $errors ) ) {
			require_once QA_INCLUDE_DIR . 'king-db/messages.php';
			require_once QA_INCLUDE_DIR . 'king-app/emails.php';

			if ( qa_opt( 'show_message_history' ) ) {
				$messageid = qa_db_message_create( $loginuserid, $toaccount['userid'], $inmessage, '', false );
			} else {
				$messageid = null;
			}

			$canreply = ! ( qa_get_logged_in_flags() & QA_USER_FLAGS_NO_MESSAGES );

			$more = strtr( qa_lang( $canreply ? 'emails/private_message_reply' : 'emails/private_message_info' ), array(
				'^f_handle' => $fromhandle,
				'^url'      => qa_path_absolute( $canreply ? ( 'message/' . $fromhandle ) : ( 'user/' . $fromhandle ) ),
			) );

			$subs = array(
				'^message'  => $inmessage,
				'^f_handle' => $fromhandle,
				'^f_url'    => qa_path_absolute( 'user/' . $fromhandle ),
				'^more'     => $more,
				'^a_url'    => qa_path_absolute( 'account' ),
			);

			if ( qa_send_notification( $toaccount['userid'], $toaccount['email'], $toaccount['handle'],
				qa_lang( 'emails/private_message_subject' ), qa_lang( 'emails/private_message_body' ), $subs ) ) {
				$messagesent = true;
			}

			qa_report_event( 'u_message', $loginuserid, qa_get_logged_in_handle(), qa_cookie_get(), array(
				'userid'    => $toaccount['userid'],
				'handle'    => $toaccount['handle'],
				'messageid' => $messageid,
				'message'   => $inmessage,
			) );

			// show message as part of general history

			if ( qa_opt( 'show_message_history' ) ) {
				qa_redirect( qa_request(), array( 'state' => ( $messagesent ? 'message-sent' : 'email-error' ) ) );
			}
		}
	}
}

$pagesize = qa_opt( 'page_size_wall' );

//	Prepare content for theme

$hideForm = ! empty( $pageerror ) || $messagesent;

$qa_content['title'] = qa_lang_html( 'misc/private_message_title' );

$qa_content['error'] = @$pageerror;

$qa_content['script_rel'][] = 'king-content/king-user.js?' . QA_VERSION;
//	If relevant, show recent message history

if ( qa_opt( 'show_message_history' ) ) {
	$recent = array_merge( $torecent, $fromrecent );

	qa_sort_by( $recent, 'created' );

	$showmessages = array_slice( array_reverse( $recent, true ), 0, 240 );

	if ( count( $showmessages ) ) {
		$options = qa_message_html_defaults();

		foreach ( $showmessages as $message ) {
			$qa_content['message_pm']['messages'][] = qa_message_html_fields( $message, $options );
		}
	} else {
		$qa_content['custom'] = '<div class="king-pm-list kingscroll" id="pmessages"></div>';
	}

	$qa_content['navigation']['sub'] = qa_messages_sub_navigation();
}

$qa_content['form_message'] = array(
	'tags'    => 'name="pmessage" method="post" action="' . qa_self_html() . '"',

	'style'   => 'tall',

	'ok'      => $messagesent ? qa_lang_html( 'misc/message_sent' ) : null,

	'fields'  => array(
		'message' => array(
			'type'  => $hideForm ? 'static' : '',
			'label' => qa_lang_html_sub( 'misc/message_for_x', qa_get_one_user_html( $handle, false ) ),
			'tags'  => 'name="message" id="message" rows="2" cols="40" ',
			'value' => qa_html( @$inmessage, $messagesent ),
			'rows'  => 4,
			'note'  => qa_lang_html_sub( 'misc/message_explanation', qa_html( qa_opt( 'site_title' ) ) ),
			'error' => qa_html( @$errors['message'] ),
		),
	),

	'buttons' => array(
		'send' => array(
			'tags'  => 'onclick="return king_submit_pm(this, false);"',
			'label' => qa_lang_html( 'main/send_button' ),
		),
	),

	'hidden'  => array(
		'domessage' => '1',
		'qa_click'  => '', // for simulating clicks in Javascript
		'handle'    => qa_html( $handle ),
		'start'     => qa_html( $start ),
		'code'      => qa_get_form_security_code( 'message-' . $handle ),
	),
);

$qa_content['focusid'] = 'message';

if ( $hideForm ) {
	unset( $qa_content['form_message']['buttons'] );

	if ( qa_opt( 'show_message_history' ) ) {
		unset( $qa_content['form_message']['fields']['message'] );
	} else {
		unset( $qa_content['form_message']['fields']['message']['note'] );
		unset( $qa_content['form_message']['fields']['message']['label'] );
	}
}

$qa_content['raw']['account'] = $toaccount; // for plugin layers to access

return $qa_content;

/*
Omit PHP closing tag to help avoid accidental output
 */