<?php

namespace OfficeBrain\Bundle\AccessManagementBundle\Entity;

use Doctrine\ORM\EntityRepository;

/**
 * @author OfficeBrain 4273 <info@officebrain.com>
 * @author OfficeBrain 4494 <info@officebrain.com>
 *
 */


/**
 * InstanceMasterRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class InstanceMasterRepository extends EntityRepository
{
    public function set($instanceMaster)
    {
        $this->_em->persist($instanceMaster);
        $this->_em->flush();
    
        return $instanceMaster->getId();
    }
    
    public function add($instance)
    {
        $instanceMaster = new InstanceMaster();

        $instanceMaster->setTheme($instance['theme']);
        $instanceMaster->setInstanceType($instance['instanceType']);
        $instanceMaster->setDomain($instance['domain']);
        $instanceMaster->setOwnerId($instance['ownerId']);
        $instanceMaster->setIsMain('0');
        $instanceMaster->setStatus($instance['status']);
        $instanceMaster->setCultureId($instance['cultureId']);
        $instanceMaster->setCultureCode($instance['cultureCode']);
        $instanceMaster->setCurrencyCode($instance['currencyCode']);
        $instanceMaster->setCurrencyName($instance['currencyName']);
        $instanceMaster->setPriceInDecimal($instance['priceInDecimal']);
        $instanceMaster->setCreatedAt(new \DateTime());
        $instanceMaster->setUpdatedAt(new \DateTime());

        return $this->set($instanceMaster);
    }

    public function find($id, $lockMode = NULL, $lockVersion = NULL)
    {
        return $this->createQueryBuilder('tm')
                ->select('tm')
                ->where('tm.id = :id')
                ->setParameter(':id', $id)
                ->getQuery()
                ->getSingleResult();
    }
    
    public function delete($id)
    {
        $instanceMaster = $this->find($id);
    
        $instanceMaster->setDeletedAt(new \DateTime());
        return $this->set($instanceMaster);
    }
    
    public function findByDomain($domain)
    {
        return $this->createQueryBuilder('tm')
            ->select('tm')
            ->leftJoin('OfficeBrainSubShopBundle:SubShop', 'ss', 'WITH', 'ss.parentId = tm.id')
            ->where('(tm.domain = :domain OR ss.externalShopDomain = :domain) AND tm.deletedAt IS NULL AND tm.status = 1')
            ->setParameter(':domain', $domain)
            ->getQuery()
            ->getOneOrNullResult();
    }
    
    public function findBySubShopId($subshop_id)
    {
        return $this->createQueryBuilder('tm')
        ->select('tm')
        ->innerJoin('OfficeBrainSubShopBundle:SubShop', 'ss', 'WITH', 'ss.parentId = tm.id AND ss.id = :subshop_id')
        ->setParameter(':subshop_id', $subshop_id)
        ->getQuery()
        ->getOneOrNullResult();
    }

    public function findBySubShopToken($stoken)
    {
        return $this->createQueryBuilder('tm')
        ->select('tm')
        ->innerJoin('OfficeBrainSubShopBundle:SubShop', 'ss', 'WITH', 'ss.parentId = tm.id AND ss.token = :token')
        ->setParameter(':token', $stoken)
        ->getQuery()
        ->getOneOrNullResult();
    }

    public function getAllInstanceMasterObject()
    {
        $objIMs = $this->createQueryBuilder('IM')
                ->select('IM')
                ->addOrderBy('IM.id', 'ASC')
                ->getQuery()// -> getSQL();
                ->getResult();
        return $objIMs;
    }
    
    public function getAllSubInstanceMasterArray()
    {
        return  $this->createQueryBuilder('IM')
                ->select('IM')
                ->andWhere('IM.isMain=0')
                ->addOrderBy('IM.id', 'ASC')
                ->getQuery()// -> getSQL();
                ->getArrayResult();
    }
    
    public function getAllInstanceMasterArray()
    {
        $arrIMs = $this->createQueryBuilder('IM')
        ->select('IM')
        ->addOrderBy('IM.id', 'ASC')
        ->getQuery()// -> getSQL();
        ->getArrayResult();
        return $arrIMs;
    }
    
    
    public function getInstanceMasterByIds($id=null)
    {
        $objIMs = $this->createQueryBuilder('IM')
                ->select('IM')
                ->andWhere('IM.id=:ids')
                ->setParameter('ids', $id)
                ->addOrderBy('IM.id', 'ASC')
                ->getQuery()// -> getSQL();
                ->getOneOrNullResult();
        return $objIMs;
    }
    
    public function getAllInstanceMasterByIds($arrIds)
    {
        $objIMs = $this->createQueryBuilder('IM')
                ->select('IM')
                ->andWhere('IM.id IN (:ids)')
                ->setParameter('ids', $arrIds)
                ->addOrderBy('IM.id', 'ASC')
                ->getQuery()// -> getSQL();
                ->getResult();
        return $objIMs;
    }
    
    public function getMainInstanceMasterObject()
    {
        $objIMs = $this->createQueryBuilder('IM')
                ->select('IM')
                ->andWhere('IM.isMain=1')
                ->addOrderBy('IM.id', 'ASC')
                ->getQuery()// -> getSQL();
                ->getResult();
        return $objIMs;
    }
    
    public function getSubDomianInstanceMasterObject($currentInstanceId=0)
    {
        $objIMs = $this->createQueryBuilder('IM')
                ->select('IM')
                ->andWhere('IM.isMain=0')
                ->andWhere('IM.isMain!=:ID')
                ->setParameter('ID', $currentInstanceId)
                ->addOrderBy('IM.id', 'ASC')
                ->getQuery()// -> getSQL();
                ->getResult();
        return $objIMs;
    }
    
    public function getSubDomianInstanceMasterByIds($currentInstanceId, $arrIds)
    {
        $objIMs = $this->createQueryBuilder('IM')
                ->select('IM')
                ->andWhere('IM.isMain=0')
                ->andWhere('IM.id!=:ID')
                ->setParameter('ID', $currentInstanceId)
                ->andWhere('IM.id IN (:ids)')
                ->setParameter('ids', $arrIds)
                ->addOrderBy('IM.id', 'ASC')
                ->getQuery()// -> getSQL();
                ->getResult();
        return $objIMs;
    }
    
    public function findByInstanceIdType($instanceId, $instanceType)
    {
    	return $this->createQueryBuilder('tm')
    	->select('tm')
    	//->leftJoin('OfficeBrainSubShopBundle:SubShop', 'ss', 'WITH', 'ss.parentId = tm.id')
    	//->where('(tm.domain = :domain OR ss.externalShopDomain = :domain) AND tm.deletedAt IS NULL AND tm.status = 1')
    	->where('tm.id = :instanceId AND tm.instanceType = :instanceType AND tm.deletedAt IS NULL AND tm.status = 1')
    	->setParameter(':instanceId', $instanceId)
    	->setParameter(':instanceType', $instanceType)
    	->getQuery()
    	->getOneOrNullResult();
    }
}
