<?php
namespace OfficeBrain\Bundle\ObSolrOperationBundle\Services;


use OfficeBrain\Bundle\ObSolrOperationBundle\Form\Data\OperationData;
use Symfony\Component\Finder\Finder;

class SyncService
{
    const COMMAND_SYNC_PRODUCT = "office_brain:solr:sync:product";
    const COMMAND_UPDATE_SUB_SHOP_PRODUCT = "office_brain:solr:sync:subshop-product-update";
    const COMMAND_DELETE_PRODUCT = "office_brain:solr:sync:delete-product";
    const SEPARATOR = "_";
    const COMMAND_BASIC = "app/console";

    private $phpPath;
    private $applicationPath;
    private $logFolder;
    private $imageFolderPath;

    public function __construct($phpPath, $applicationPath, $logFolder, $imageFolderPath)
    {
        $this->phpPath = $phpPath;
        $this->applicationPath = $applicationPath;
        $this->logFolder = $logFolder;
        $this->imageFolderPath = $imageFolderPath;
    }

    public function genericExecuteCommand($command)
    {
        exec($command . ' &', $returnData);
    }

    public function processProductSyncCommand(OperationData $options,$isGenerateLog=true)
    {
        $command = $this->phpPath . ' ' . $this->applicationPath . self::COMMAND_BASIC . ' ' . self::COMMAND_SYNC_PRODUCT;
        if ($options->getProjectId() != "") {
            $command = $command . ' --projectId="' . $options->getProjectId() . '"';
        }        
        if ($options->getProductId() != "") {
        	$command = $command . ' --productId="' . $options->getProductId() . '"';
        }
        if ($options->getSupplierId() != "") {
            $command = $command . ' --supplierId="' . $options->getSupplierId() . '"';
        }
        if ($options->getInstanceId() != "") {
        	$command = $command . ' --instanceId="' . $options->getInstanceId() . '"';
        }
        if ($options->getCulture()) {
            $command = $command . ' --culture="' . $options->getCulture() . '"';
        }
        
        if($isGenerateLog)
        {
            $outPutFile = $this->generateFileFromCommand(self::COMMAND_SYNC_PRODUCT, $options);
        }
        else {
            $outPutFile=' /dev/null';
        }        
        $env = $options->getEnv() ? $options->getEnv() : "dev";        
        $command .= ' --env="'.$env.'"';
        
        $command .= ' --no-debug';
        
        $command = $command . ' > ' . $outPutFile;        
        
        $this->genericExecuteCommand($command);

        return $outPutFile;
    }
    
    /*
     * Sync sub shop products.
     */
    public function processSubShopProductSyncCommand(OperationData $options,$isGenerateLog=true)
    {
        $command = $this->phpPath . ' ' . $this->applicationPath . self::COMMAND_BASIC . ' ' . self::COMMAND_UPDATE_SUB_SHOP_PRODUCT;
        if ($options->getProjectId() != "") {
            $command = $command . ' --projectId="' . $options->getProjectId() . '"';
        }        
        if ($options->getProductId() != "") {
        	$command = $command . ' --productId="' . $options->getProductId() . '"';
        }
        if ($options->getSupplierId() != "") {
            $command = $command . ' --supplierId="' . $options->getSupplierId() . '"';
        }
        
        if ($options->getInstanceId() != "") {
        	$command = $command . ' --instanceId="' . $options->getInstanceId() . '"';
        }
        
        if ($options->getCulture()) {
            $command = $command . ' --culture="' . $options->getCulture() . '"';
        }
        
        if ($options->getLanguageId()) {
            $command = $command . ' --languageId="' . $options->getLanguageId() . '"';
        }
        
        if($isGenerateLog)
        {
            $outPutFile = $this->generateFileFromCommand(self::COMMAND_UPDATE_SUB_SHOP_PRODUCT, $options);
        }
        else {
            $outPutFile=' /dev/null';
        }        
        $env = $options->getEnv() ? $options->getEnv() : "dev";        
        $command .= ' --env="'.$env.'"';
        
        $command = $command . ' > ' . $outPutFile;        
        
        $this->genericExecuteCommand($command);

        return $outPutFile;
    }


    /**
     * Function to process delete product command
     * @param $options
     * @return string
     */
    public function processDeleteProductCommand(OperationData $options,$isGenerateLog=true)
    {
        $command = $this->phpPath . ' ' . $this->applicationPath . self::COMMAND_BASIC . ' ' . self::COMMAND_DELETE_PRODUCT;
        if ($options->getCulture()) {
            $command = $command . ' --culture="' . $options->getCulture() . '"';
        }
        if ($options->getProductId()) {
            $command = $command . ' --productId="' . $options->getProductId() . '"';
        }
        if ($options->getSupplierId()) {
            $command = $command . ' --supplierId="' . $options->getSupplierId() . '"';
        }
        if ($options->getSku()) {
            $command = $command . ' --productSku="' . $options->getSku() . '"';
        }
        if ($options->getInstanceId() != "") {
        	$command = $command . ' --instanceId="' . $options->getInstanceId() . '"';
        }
        /*if ($options->getProjectId() != "") {
        	$command = $command . ' --projectId="' . $options->getProjectId() . '"';
        } */       

        $env = $options->getEnv() ? $options->getEnv() : "dev";        
        $command .= ' --env="'.$env.'"';
        
        if($isGenerateLog){
            $outPutFile = $this->generateFileFromCommand(self::COMMAND_DELETE_PRODUCT, $options);
        }
        else {
            $outPutFile=' /dev/null';
        }
        $command = $command . ' > ' . $outPutFile;
        
        $this->genericExecuteCommand($command);

        return $outPutFile;
    }

    /**
     * Generate file for command
     * @param $command
     * @param $options
     * @return string
     */
    public function generateFileFromCommand($command, OperationData $options)
    {
        $file = date("Y-m-d-H-i-s") . '.log';
        switch ($command) {
            case self::COMMAND_SYNC_PRODUCT:
                if ($options->getProductId()) {
                    $file = "pid" . self::SEPARATOR . $options->getProductId() . self::SEPARATOR . $file;
                }
                if ($options->getSupplierId()) {
                    $file = "sid" . self::SEPARATOR . $options->getSupplierId() . self::SEPARATOR . $file;
                }
                if ($options->getCulture()) {
                    $file = $options->getCulture() . self::SEPARATOR . $file;
                }
                $file = "productSync" . self::SEPARATOR . $file;
                break;
            case self::COMMAND_DELETE_PRODUCT:
                if ($options->getProductId()) {
                    $file = "pid" . self::SEPARATOR . $options->getProductId() . self::SEPARATOR . $file;
                }
                if ($options->getSupplierId()) {
                    $file = "sid" . self::SEPARATOR . $options->getSupplierId() . self::SEPARATOR . $file;
                }
                if ($options->getSku()) {
                    $file = "sku" . self::SEPARATOR . self::SEPARATOR . $file;
                }
                if ($options->getCulture()) {
                    $file = $options->getCulture() . self::SEPARATOR . $file;
                }
                $file = "deleteProduct" . self::SEPARATOR . $file;
                break;
        }
        if (!is_dir($this->logFolder)) {
            mkdir($this->logFolder, 0755, true);
        }

        $logFolderPath = $this->logFolder . DIRECTORY_SEPARATOR . date('d-m-Y');
        if (!is_dir($logFolderPath)) {
            mkdir($logFolderPath, 0755, true);
        }

        return $logFolderPath . DIRECTORY_SEPARATOR . $file;
    }   

} 