#!/usr/bin/env php
<?php

// file import to DAV utility

if(!file_exists('include/cli_startup.php')) {
	echo 'Run dcp from the top level Hubzilla web directory, as util/dcp <args>' . PHP_EOL;
	exit(1);
}

require_once('include/cli_startup.php');
require_once('include/attach.php');

cli_startup();


if($argc < 3) {
	echo "Usage: " . $argv[0] . ' src dstdir' . "\n";
	echo 'Always run from the toplevel web directory.' . "\n";
	echo 'destination should begin with store/$nickname/desired/path or $nickname/desired/path' . "\n";
	echo 'Example: util/dcp /etc/motd store/joe/etc' . "\n";
	exit;
}

	$recursive = false;
	$dstfile   = $argv[$argc - 1];

	if(strpos($dstfile,'store/') === 0)
		$dstfile = substr($dstfile,6);

	if(strpos($dstfile,'/'))
		$nick = substr($dstfile,0,strpos($dstfile,'/'));
		$dstfile = substr($dstfile,strlen($nick)+1);
	}
	else {
		$nick = $dstfile;
		$dstfile = '';
	}

	$channel = channelx_by_nick($nick);
	if(! $channel)
		return;

	for($x = 1; $x < ($argc - 1); $x ++) {
		if(($argv[$x] === '-r') || ($argv[$x] === '-R')) {
			$recursive = true;
			break;
		}
	}

	$rootdir = ((strlen(trim($dstfile,'/'))) ? false : true);
		
	$isadir = false;

	if(($recursive) || ($argc > 3))
		$isadir = true;


	if($rootdir) { 
		$folder = '';
	}
	else {

		$r = q("select * from attach where display_path = '%s' and uid = %d limit 1",
			dbesc($dstfile),
			intval($channel['channel_id'])
		);

		if($r && $r[0]['is_dir']) {
			$isadir = true;
			$basepath = $dstfile;
			$folder = $r[0]['hash'];
		}
		else {
			$pathname = (($isadir) ? $dstfile : dirname($dstfile));
			$arr = [
				'pathname'  => $pathname,
				'allow_cid' => $channel['channel_allow_cid'],
				'allow_gid' => $channel['channel_allow_gid'],
				'deny_cid'  => $channel['channel_deny_cid'],
				'deny_gid'  => $channel['channel_deny_gid'],
			];

			$folder = '';
			if($pathname && $isadir) {
				$x = attach_mkdirp($channel,$channel['channel_hash'],$arr);
				if($x['success'])
					$folder = $x['data']['hash'];
			}
		}
	}

	for($x = 1; $x < ($argc - 1); $x ++) {
		if(($argv[$x] === '-r') || ($argv[$x] === '-R')) {
			continue;
		}

		if(is_dir($argv[$x])) {
			if($recursive) {
				dcp_recurse($channel,$argv[$x],$basepath,$folder);
			}
			else {
				continue;
			}
		}
		else {
			$dstname = (($isadir) ? '' : basename($dstfile));
			$cmd = [ 'Importfile', $channel['channel_id'], $argv[$x], $folder, $dstname ];
			\Zotlabs\Daemon\Master::Summon($cmd);
		}
	}


	function dcp_recurse($channel,$src,$basepath,$folder) {
		$dir = opendir($src);
		if($dir) {
			while(($entry = readdir($dir)) !== false) {
				if($entry === '.' || $entry === '..')
					continue;

				$dstfile = $basepath . '/' . $entry;
				if(is_dir($src . '/' . $entry)) {
					$r = q("select * from attach where display_path = '%s' and uid = %d limit 1",
						dbesc($dstfile),
						intval($channel['channel_id'])
					);

					if($r && $r[0]['is_dir']) {
						$folder = $r[0]['hash'];
					}
					else {

						$arr = [
							'pathname'  => $dstfile,
							'allow_cid' => $channel['channel_allow_cid'],
							'allow_gid' => $channel['channel_allow_gid'],
							'deny_cid'  => $channel['channel_deny_cid'],
							'deny_gid'  => $channel['channel_deny_gid'],
						];

						$folder = '';
						$x = attach_mkdirp($channel,$channel['channel_hash'],$arr);
						if($x['success'])
							$folder = $x['data']['hash'];
					}
					dcp_recurse($channel,$src . '/' . $entry,$dstfile,$folder);
				}
				else {
					$cmd = [ 'Importfile', $channel['channel_id'], $src . '/' . $entry, $folder ];
					\Zotlabs\Daemon\Master::Summon($cmd);
				}
			}
			closedir($dir);
		}
	}