<?php

namespace OfficeBrain\Bundle\SubShopBundle\Entity;

use Doctrine\ORM\EntityRepository;
use Doctrine\ODM\MongoDB\Mapping\Annotations\Date;

/**
 * SubShopInquiryRepository.
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class SubShopInquiryRepository extends EntityRepository
{
    protected $projectSetting;
    protected $instanceId;
    protected $instanceType;
    protected $cultureId;
    protected $cultureCode;

    public function setProjectSetting($projetSetting)
    {
        $this->projectSetting = $projetSetting;
        $this->prepareProjectSettingData();
    }

    public function getProjectSetting()
    {
        return $this->projetSetting;
    }

    public function prepareProjectSettingData()
    {
        $this->instanceId = $this->projectSetting['instance_id'];
        $this->instanceType = $this->projectSetting['instance_type'];
        $this->userId = $this->projectSetting['user_id'];
        $this->cultureId = $this->projectSetting['culture_id'];
        $this->cultureCode = $this->projectSetting['culture_code'];
    }

    public function set($sub_shop_inquiry)
    {
        return $this->commit($sub_shop_inquiry);
    }

    public function findAll()
    {
        return $this->createQueryBuilder('si')
                    ->select('si')
                    ->where('si.status IS NULL AND si.deletedAt IS NULL')
                    ->andWhere('si.instanceId  = :instanceId')
                    ->setParameter(':instanceId', $this->instanceId)
                    ->orderBy('si.id', 'DESC')
                    ->getQuery()
                    ->getResult();
    }

    public function find($id, $lockMode = NULL, $lockVersion = NULL)
    {
        return $this->createQueryBuilder('si')
                ->select('si')
                ->where('si.id = :id')
                ->andWhere('si.instanceId  = :instanceId')
                ->setParameter(':id', $id)
                ->setParameter(':instanceId', $this->instanceId)
                ->getQuery()
                ->getSingleResult();
    }

    public function findByStatus($status_id)
    {
        return $this->createQueryBuilder('si')
                ->select('si')
                ->where('si.status = :status_id AND si.deletedAt IS NULL')
                ->andWhere('si.instanceId  = :instanceId')
                ->setParameter(':status_id', $status_id)
                ->setParameter(':instanceId', $this->instanceId)
                ->orderBy('si.id', 'DESC')
                ->getQuery()
                ->getResult();
    }

    public function findByDelete()
    {
        return $this->createQueryBuilder('si')
                ->select('si')
                ->where('si.deletedAt IS NOT NULL')
                ->andWhere('si.instanceId  = :instanceId')
                ->setParameter(':instanceId', $this->instanceId)
                ->orderBy('si.id', 'DESC')
                ->getQuery()
                ->getResult();
    }

    public function findByOption($option, $keyword, $status_id)
    {
        $return = $this->createQueryBuilder('si')
                    ->select('si')
                    ->where('si.status'.($status_id > 0 ? ' = :status_id' : ' IS NULL').' AND si.deletedAt IS NULL')
                    ->andWhere('si.instanceId  = :instanceId');

        if ($option == 'id') {
            $return->andWhere('si.'.$option.' = :keyword')
                   ->setParameter(':keyword', $keyword);
        } elseif ($option == 'name') {
            $return->andWhere('si.firstName like :keyword OR si.lastName like :keyword')
                   ->setParameter(':keyword', '%'.$keyword.'%');
        } elseif ($option == 'createdAt') {
            $keyword = str_replace('/', '-', $keyword);
            $return->andWhere('si.'.$option.' BETWEEN :startedDatetime AND :endedDatetime')
                   ->setParameter(':startedDatetime', date('Y-m-d H:i:s', strtotime($keyword.' 00:00:00')))
                   ->setParameter(':endedDatetime', date('Y-m-d H:i:s', strtotime($keyword.' 23:59:59')));
        } else {
            $return->andWhere('si.'.$option.' like :keyword')
            ->setParameter(':keyword', '%'.$keyword.'%');
        }
        if ($status_id > 0) {
            $return->setParameter(':status_id', $status_id);
        }

        $return->setParameter(':instanceId', $this->instanceId)
                ->orderBy('si.id', 'DESC')
                    ->getQuery()
                    ->getResult();

        return $return;
    }

    /**
     * Commit entity.
     */
    private function commit($entity)
    {
        $this->_em->persist($entity);
        $this->_em->flush();

        return $entity->getId();
    }
}
