<?php
namespace Zotlabs\Module;

use App;
use Zotlabs\Lib\Apps;
use Zotlabs\Web\Controller;
use Zotlabs\Lib\Libsync;

require_once('include/socgraph.php');
require_once('include/selectors.php');
require_once('include/group.php');
require_once('include/photos.php');

class Defperms extends Controller {

	/* @brief Initialize the connection-editor
	 *
	 *
	 */

	function init() {
	
		if(! local_channel())
			return;

		if(! Apps::system_app_installed(local_channel(), 'Default Permissions'))
			return;
	
		$r = q("SELECT abook.*, xchan.*
			FROM abook left join xchan on abook_xchan = xchan_hash
			WHERE abook_self = 1 and abook_channel = %d LIMIT 1",
			intval(local_channel())
		);
		if($r) {
			App::$poi = $r[0];
		}

		$channel = App::get_channel();
		if($channel)
			head_set_icon($channel['xchan_photo_s']);	
	}

	
	/* @brief Evaluate posted values and set changes
	 *
	 */
	
	function post() {
	
		if(! local_channel())
			return;

		if(! Apps::system_app_installed(local_channel(), 'Default Permissions'))
			return;
	
		$contact_id = intval(argv(1));
		if(! $contact_id)
			return;
	
		$channel = App::get_channel();
	
		$orig_record = q("SELECT * FROM abook WHERE abook_id = %d AND abook_channel = %d LIMIT 1",
			intval($contact_id),
			intval(local_channel())
		);
	
		if(! $orig_record) {
			notice( t('Could not access contact record.') . EOL);
			goaway(z_root() . '/connections');
			return; // NOTREACHED
		}
	

		if(intval($orig_record[0]['abook_self'])) {
			$autoperms = intval($_POST['autoperms']);
			$is_self = true;
		}
		else {
			$autoperms = null;
			$is_self = false;
		}
	
	
		$all_perms = \Zotlabs\Access\Permissions::Perms();

		if($all_perms) {
			foreach($all_perms as $perm => $desc) {

				$checkinherited = \Zotlabs\Access\PermissionLimits::Get(local_channel(),$perm);
				$inherited = (($checkinherited & PERMS_SPECIFIC) ? false : true);

				if(array_key_exists('perms_' . $perm, $_POST)) {
					set_abconfig($channel['channel_id'],$orig_record[0]['abook_xchan'],'my_perms',$perm,
						intval($_POST['perms_' . $perm]));
					if($autoperms) {
						set_pconfig($channel['channel_id'],'autoperms',$perm,intval($_POST['perms_' . $perm]));
					}
				}
				else {
					set_abconfig($channel['channel_id'],$orig_record[0]['abook_xchan'],'my_perms',$perm,0);
					if($autoperms) {
						set_pconfig($channel['channel_id'],'autoperms',$perm,0);
					}
				}
			}
		}

		if(! is_null($autoperms)) 
			set_pconfig($channel['channel_id'],'system','autoperms',$autoperms);
				
	
		notice( t('Settings updated.') . EOL);

	
		// Refresh the structure in memory with the new data
	
		$r = q("SELECT abook.*, xchan.*
			FROM abook left join xchan on abook_xchan = xchan_hash
			WHERE abook_channel = %d and abook_id = %d LIMIT 1",
			intval(local_channel()),
			intval($contact_id)
		);
		if($r) {
			App::$poi = $r[0];
		}
	
	
		$this->defperms_clone($a);
	
		goaway(z_root() . '/defperms');
	
		return;
	
	}
	
	/* @brief Clone connection
	 *
	 *
	 */
	
	function defperms_clone(&$a) {
	
			if(! App::$poi)
				return;
		
			$channel = App::get_channel();
	
			$r = q("SELECT abook.*, xchan.*
				FROM abook left join xchan on abook_xchan = xchan_hash
				WHERE abook_channel = %d and abook_id = %d LIMIT 1",
				intval(local_channel()),
				intval(App::$poi['abook_id'])
			);
			if($r) {
				App::$poi = array_shift($r);
			}
	
			$clone = App::$poi;
	
			unset($clone['abook_id']);
			unset($clone['abook_account']);
			unset($clone['abook_channel']);
	
			$abconfig = load_abconfig($channel['channel_id'],$clone['abook_xchan']);
			if($abconfig)
				$clone['abconfig'] = $abconfig;
	
			Libsync::build_sync_packet(0 /* use the current local_channel */, array('abook' => array($clone)));
	}
	
	/* @brief Generate content of connection default permissions page
	 *
	 *
	 */
	
	function get() {
	
		$sort_type = 0;
		$o = '';
	
		if(! local_channel()) {
			notice( t('Permission denied.') . EOL);
			return login();
		}

		if(! Apps::system_app_installed(local_channel(), 'Default Permissions')) {
			//Do not display any associated widgets at this point
			App::$pdl = '';

			$o = '<b>' . t('Default Permissions App') . ' (' . t('Not Installed') . '):</b><br>';
			$o .= t('Set custom default permissions for new connections');
			return $o;
		}
	
		$section = ((array_key_exists('section',$_REQUEST)) ? $_REQUEST['section'] : '');
		$channel = App::get_channel();
	
		$yes_no = array(t('No'),t('Yes'));
	
		$connect_perms = \Zotlabs\Access\Permissions::connect_perms(local_channel());

		$o .= "<script>function connectDefaultShare() {
		\$('.abook-edit-me').each(function() {
			if(! $(this).is(':disabled'))
				$(this).prop('checked', false);
		});\n\n";
		foreach($connect_perms['perms'] as $p => $v) {
			if($v) {
				$o .= "\$('#me_id_perms_" . $p . "').prop('checked', true); \n";
			}
		}
		$o .= " }\n</script>\n";
	
		if(App::$poi) {
	
			$sections = [];

			$self = false;
	
			$tpl = get_markup_template('defperms.tpl');
	
	
			$perms = array();
			$channel = App::get_channel();

			$contact = App::$poi;
	
			$global_perms = \Zotlabs\Access\Permissions::Perms();

			$hidden_perms = [];
	
			foreach($global_perms as $k => $v) {
				$thisperm = get_abconfig(local_channel(),$contact['abook_xchan'],'my_perms',$k);
				
				$checkinherited = \Zotlabs\Access\PermissionLimits::Get(local_channel(),$k);

				$inherited = (($checkinherited & PERMS_SPECIFIC) ? false : true);

				$perms[] = [ 'perms_' . $k, $v, intval($thisperm), '', $yes_no, (($inherited) ? ' disabled="disabled" ' : '') ];
				if($inherited) {
					$hidden_perms[] = [ 'perms_' . $k, intval($thisperm) ];
				}
			}
	
			$pcat = new \Zotlabs\Lib\Permcat(local_channel());
			$pcatlist = $pcat->listing();
			$permcats = [];
			if($pcatlist) {
				foreach($pcatlist as $pc) {
					$permcats[$pc['name']] = $pc['localname'];
				}
			}

			$o .= replace_macros($tpl, [
				'$header'         => t('Connection Default Permissions'),
				'$autoperms'      => array('autoperms',t('Apply these permissions automatically'), ((get_pconfig(local_channel(),'system','autoperms')) ? 1 : 0), t('If enabled, connection requests will be approved without your interaction'), $yes_no),
				'$permcat'        => [ 'permcat', t('Permission role'), '', '<span class="loading invisible">' . t('Loading') . '<span class="jumping-dots"><span class="dot-1">.</span><span class="dot-2">.</span><span class="dot-3">.</span></span></span>',$permcats ],
				'$permcat_new'    => t('Add permission role'),
				'$permcat_enable' => Apps::system_app_installed(local_channel(), 'Permission Categories'),
				'$section'        => $section,
				'$sections'       => $sections,
				'$autolbl'        => t('The permissions indicated on this page will be applied to all new connections.'),
				'$autoapprove'    => t('Automatic approval settings'),
				'$unapproved'     => $unapproved,
				'$inherited'      => t('inherited'),
				'$submit'         => t('Submit'),
				'$me'             => t('My Settings'),
				'$perms'          => $perms,
				'$hidden_perms'   => $hidden_perms,
				'$permlbl'        => t('Individual Permissions'),
				'$permnote_self'  => t('Some individual permissions may have been preset or locked based on your channel type and privacy settings.'),
				'$contact_id'     => $contact['abook_id'],
				'$name'           => $contact['xchan_name'],
			]);
	
			$arr = array('contact' => $contact,'output' => $o);
	
			call_hooks('contact_edit', $arr);
	
			return $arr['output'];
	
		}	
	}
}