<?php
    /**
     * Model class of the autoinstall module
     * @author NHN (developers@xpressengine.com)
     **/
    class autoinstallModel extends autoinstall {

		/**
		 * Get category information
		 *
		 * @param int $category_srl The sequence of category to get information
		 * @return object
		 */
        function getCategory($category_srl)
        {
            $args->category_srl = $category_srl;
            $output = executeQueryArray("autoinstall.getCategory", $args);
            if(!$output->data) return null;
            return array_shift($output->data);
        }

		/**
		 * Get packages information
		 *
		 * @return array
		 */
        function getPackages()
        {
            $output = executeQueryArray("autoinstall.getPackages");
            if(!$output->data) return array();
            return $output->data;
        }

		/**
		 * Get installed packages information
		 *
		 * @param int $package_srl The sequence of package to get information
		 * @return object
		 */
        function getInstalledPackage($package_srl)
        {
            $args->package_srl = $package_srl;
            $output = executeQueryArray("autoinstall.getInstalledPackage", $args);
            if(!$output->data) return null;
            return array_shift($output->data);
        }

		/**
		 * Get one package information
		 *
		 * @param int $package_srl The sequence of package to get information
		 * @return object
		 */
        function getPackage($package_srl)
        {
            $args->package_srl = $package_srl;
            $output = executeQueryArray("autoinstall.getPackage", $args);
            if(!$output->data) return null;
            return array_shift($output->data);
        }

		/**
		 * Get category list
		 *
		 * @return array
		 */
        function getCategoryList()
        {
            $output = executeQueryArray("autoinstall.getCategories");
            if(!$output->toBool() || !$output->data) return array();

            $categoryList = array();
            foreach($output->data as $category)
            {
                $category->children = array();
                $categoryList[$category->category_srl] = $category;
            }

            $depth0 = array();
            foreach($categoryList as $key => $category)
            {
                if($category->parent_srl)
                {
                    $categoryList[$category->parent_srl]->children[] =& $categoryList[$key];
                }
                else
                {
                    $depth0[] = $key;
                }
            }
            $resultList = array();
            foreach($depth0 as $category_srl)
            {
                $this->setDepth($categoryList[$category_srl], 0, $categoryList, $resultList);
            }
            return $resultList;
        }

		/**
		 * Get pcakge count in category
		 *
		 * @param int $category_srl The sequence of category to get count
		 * @return int
		 */
        function getPackageCount($category_srl)
        {
            $args->category_srl = $category_srl;
            $output = executeQuery("autoinstall.getPackageCount", $args);
            if(!$output->data) return 0;
            return $output->data->count;
        }

		/**
		 * Get installed package count
		 *
		 * @return int
		 */
        function getInstalledPackageCount()
        {
            $output = executeQuery("autoinstall.getInstalledPackageCount", $args);
            if(!$output->data) return 0;
            return $output->data->count;
        }

		/**
		 * Set depth, children list and package count of category
		 *
		 * @param object $item Category information
		 * @param int $depth Depth of category
		 * @param array $list Category list
		 * @param array $resultList Final result list
		 * @return string $siblingList Comma seperated list
		 */
        function setDepth(&$item, $depth, &$list, &$resultList)
        {
            $resultList[$item->category_srl] =& $item;
            $item->depth = $depth;
            $siblingList = $item->category_srl;
            foreach($item->children as $child)
            {
                $siblingList .= ",".$this->setDepth($list[$child->category_srl], $depth+1, $list, $resultList);
            }
            if(count($item->children) < 1)
            {
                $item->nPackages = $this->getPackageCount($item->category_srl);
            }
            $item->childrenList = $siblingList;
            return $siblingList;
        }

		/**
		 * Get lastest package information
		 *
		 * @return object Returns lastest package information. If no result returns null.
		 */
        function getLatestPackage() {
            $output = executeQueryArray("autoinstall.getLatestPackage");
            if(!$output->data) return null;
            return array_shift($output->data);
        }

		/**
		 * Get installed package informations
		 *
		 * @param array $package_list Package sequence list to get information
		 * @return array Returns array contains pacakge information. If no result returns empty array.
		 */
        function getInstalledPackages($package_list) {
            $args->package_list = $package_list;
            $output = executeQueryArray("autoinstall.getInstalledPackages", $args);
            $result = array();
            if(!$output->data) return $result;
            foreach($output->data as $value)
            {
                $result[$value->package_srl] = $value;
            }
            return $result;
        }

		/**
		 * Get installed package list
		 *
		 * @param int $page
		 * @return Object
		 */
        function getInstalledPackageList($page)
        {
            $args->page = $page;
			$args->list_count = 10;
			$args->page_count = 5;
            $output = executeQueryArray("autoinstall.getInstalledPackageList", $args);
            $res = array();
			if ($output->data)
			{
				foreach($output->data as $val)
				{
					$res[$val->package_srl] = $val;
				}
			}
            $output->data = $res;
            return $output;
        }

		/**
		 * Get type using path
		 *
		 * @param string $path Path to get type
		 * @return string
		 */
		function getTypeFromPath($path)
		{
			if(!$path) return null;
			if($path == ".") return "core";
			$path_array = explode("/", $path);
            $target_name = array_pop($path_array);
            $type = substr(array_pop($path_array), 0, -1);
			return $type;
		}

		/**
		 * Get config file path by type
		 *
		 * @param string $type Type to get config file path
		 * @return string
		 */
		function getConfigFilePath($type)
		{
			$config_file = null;
			switch($type)
			{
				case "m.layout":
				case "module":
					case "addon":
					case "layout":
					case "widget":
					$config_file = "/conf/info.xml";
				break;
				case "component":
					$config_file = "/info.xml";
				break;
				case "m.skin":
				case "skin":
				case "widgetstyle":
				case "style":
					$config_file = "/skin.xml";
				break;
				case "drcomponent":
					$config_file = "/info.xml";
				break;
			}
			return $config_file;
		}

		/**
		 * Returns target is removable
		 *
		 * @param string $path Path
		 * @return bool
		 */
		function checkRemovable($path)
		{
			$path_array = explode("/", $path);
            $target_name = array_pop($path_array);
			$oModule =& getModule($target_name, "class");
			if(!$oModule) return false;
			if(method_exists($oModule, "moduleUninstall")) return true;
			else return false;
		}

		/**
		 * Get sequence of package by path
		 *
		 * @param string $path Path to get sequence
		 * @return int
		 */
		function getPackageSrlByPath($path)
		{
			if (!$path) return;

			if(substr($path,-1) == '/') $path = substr($path, 0, strlen($path)-1);

			if (!$GLOBLAS['XE_AUTOINSTALL_PACKAGE_SRL_BY_PATH'][$path])
			{
				$args->path = $path;
				$output = executeQuery('autoinstall.getPackageSrlByPath', $args);

				$GLOBLAS['XE_AUTOINSTALL_PACKAGE_SRL_BY_PATH'][$path] = $output->data->package_srl;
			}

			return $GLOBLAS['XE_AUTOINSTALL_PACKAGE_SRL_BY_PATH'][$path];
		}

		/**
		 * Get remove url by package srl
		 *
		 * @param int $packageSrl Sequence of pakcage to get url
		 * @return string
		 */
		function getRemoveUrlByPackageSrl($packageSrl)
		{
            $ftp_info =  Context::getFTPInfo();
            if (!$ftp_info->ftp_root_path) return;
			
			if (!$packageSrl) return;

			return getNotEncodedUrl('', 'module', 'admin', 'act', 'dispAutoinstallAdminUninstall', 'package_srl', $packageSrl);
		}

		/**
		 * Get remove url by path
		 *
		 * @param string $path Path to get url
		 * @return string
		 */
		function getRemoveUrlByPath($path)
		{
			if (!$path) return;

            $ftp_info =  Context::getFTPInfo();
            if (!$ftp_info->ftp_root_path) return;

			$packageSrl = $this->getPackageSrlByPath($path);
			if (!$packageSrl) return;

			return getNotEncodedUrl('', 'module', 'admin', 'act', 'dispAutoinstallAdminUninstall', 'package_srl', $packageSrl);
		}

		/**
		 * Get update url by package srl
		 *
		 * @param int $packageSrl Sequence to get url
		 * @return string
		 */
		function getUpdateUrlByPackageSrl($packageSrl)
		{
			if (!$packageSrl) return;

			return getNotEncodedUrl('', 'module', 'admin', 'act', 'dispAutoinstallAdminInstall', 'package_srl', $packageSrl);
		}

		/**
		 * Get update url by path
		 *
		 * @param string $path Path to get url
		 * @return string
		 */
		function getUpdateUrlByPath($path)
		{
			if (!$path) return;

			$packageSrl = $this->getPackageSrlByPath($path);
			if (!$packageSrl) return;

			return getNotEncodedUrl('', 'module', 'admin', 'act', 'dispAutoinstallAdminInstall', 'package_srl', $packageSrl);
		}
   }
?>
