<?php

/**
 *
 * PHP Pro Bid $Id$ IdzhVuypRXQ/FsJC7Y7dyBy7ikL2xkuzLaf2iCtdwZg=
 *
 * @link        http://www.phpprobid.com
 * @copyright   Copyright (c) 2014 Online Ventures Software LTD & CodeCube SRL
 * @license     http://www.phpprobid.com/license Commercial License
 *
 * @version     7.9 [rev.7.9.01]
 */
/**
 * newsletters table service class
 */


namespace Ppb\Service;

use Cube\Db\Expr,
    Ppb\Db\Table;

class Newsletters extends AbstractService
{

    /**
     *
     * newsletters recipients array
     *
     * @var array
     */
    protected $_recipients = array(
        'all'         => array(
            'name'  => 'All Users',
            'query' => '1',
            'table' => '\\Ppb\\Db\\Table\\Users',
        ),
        'active'      => array(
            'name'  => 'Active Users',
            'query' => 'active = 1',
            'table' => '\\Ppb\\Db\\Table\\Users',
        ),
        'suspended'   => array(
            'name'  => 'Suspended Users',
            'query' => 'active = 0',
            'table' => '\\Ppb\\Db\\Table\\Users',
        ),
        'subscribers' => array(
            'name'  => 'Newsletter Subscribers',
            'query' => '1',
            'table' => '\\Ppb\\Db\\Table\\NewslettersSubscribers',
        ),
        'store'       => array(
            'name'  => 'Store Owners',
            'query' => 'active = 1 AND store_active = 1',
            'table' => '\\Ppb\\Db\\Table\\Users',
        ),
    );

    /**
     *
     * class constructor
     */
    public function __construct()
    {
        parent::__construct();

        $this->setTable(
            new Table\Newsletters());
    }

    /**
     *
     * set recipients array
     *
     * @param array $recipients
     *
     * @return $this
     */
    public function setRecipients(array $recipients)
    {
        $this->_recipients = $recipients;

        return $this;
    }

    /**
     *
     * get recipients array
     *
     * @return array
     */
    public function getRecipients()
    {
        return $this->_recipients;
    }

    /**
     *
     * get recipient by key
     *
     * @param string $key
     *
     * @return array|false
     */
    public function getRecipient($key)
    {
        if (array_key_exists($key, $this->_recipients)) {
            return $this->_recipients[$key];
        }

        return false;
    }


    /**
     *
     * save newsletter recipients in the recipients table
     * return the number recipients saved or false
     *
     * @param string $key recipients to send to
     * @param int    $id  newsletter id
     *
     * @return int|false
     */
    public function saveRecipients($key, $id)
    {
        if (($recipient = $this->getRecipient($key)) !== false) {
            $newslettersRecipients = new Table\NewslettersRecipients();
            $tableClassName = $recipient['table'];

            /** @var \Cube\Db\Table\AbstractTable $tableClass */
            $tableClass = new $tableClassName();

            $newslettersRecipients->getAdapter()
                ->query("INSERT INTO " . $newslettersRecipients->getPrefix() . $newslettersRecipients->getName() . "
                    (newsletter_id, email)
                    SELECT {$id}, email
                    FROM " . $tableClass->getPrefix() . $tableClass->getName() . "
                    WHERE {$recipient['query']}");

            return true;
        }

        return false;
    }

    /**
     *
     * create or update a newsletter
     *
     * @param array $data
     *
     * @return $this
     */
    public function save($data)
    {
        $row = null;

        $data = $this->_prepareSaveData($data);

        if (array_key_exists('id', $data)) {
            $select = $this->_table->select()
                ->where("id = ?", $data['id']);

            unset($data['id']);

            $row = $this->_table->fetchRow($select);
        }

        if (count($row) > 0) {

//            $data['updated_at'] = new Expr('now()');
            $this->_table->update($data, "id='{$row['id']}'");
        }
        else {
            $data['created_at'] = new Expr('now()');
            $this->_table->insert($data);
        }

        return $this;
    }


    /**
     *
     * delete a newsletter from the table
     *
     * @param integer $id the id of the newsletter
     *
     * @return integer     returns the number of affected rows
     */
    public function delete($id)
    {
        return $this->_table->delete(
            $this->_table->getAdapter()->quoteInto('id = ?', $id));
    }
}