<?php
/**
 * @brief		Alternative Contact Model
 * @author		<a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
 * @copyright	(c) Invision Power Services, Inc.
 * @license		https://www.invisioncommunity.com/legal/standards/
 * @package		Invision Community
 * @subpackage	Nexus
 * @since		09 May 2014
 */

namespace IPS\nexus\Customer;

/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * Alternative Contact Model
 */
class _AlternativeContact extends \IPS\Patterns\ActiveRecord
{	
	/**
	 * @brief	Multiton Store
	 */
	protected static $multitons;

	/**
	 * @brief	Database Table
	 */
	public static $databaseTable = 'nexus_alternate_contacts';
	
	/**
	 * @brief	[ActiveRecord] ID Database Column
	 */
	public static $databaseColumnId = NULL;
		
	/**
	 * Get main account
	 *
	 * @return	\IPS\nexus\Customer
	 */
	public function get_main_id()
	{
		return \IPS\nexus\Customer::load( $this->_data['main_id'] );
	}
	
	/**
	 * Set main account
	 *
	 * @param	\IPS\Member
	 * @return	void
	 */
	public function set_main_id( \IPS\Member $member )
	{
		$this->_data['main_id'] = $member->member_id;
	}
	
	/**
	 * Get alternate account
	 *
	 * @return	\IPS\nexus\Customer
	 */
	public function get_alt_id()
	{
		return \IPS\nexus\Customer::load( $this->_data['alt_id'] );
	}
	
	/**
	 * Set alternate account
	 *
	 * @param	\IPS\Member
	 * @return	void
	 */
	public function set_alt_id( \IPS\Member $member )
	{
		$this->_data['alt_id'] = $member->member_id;
	}
	
	/**
	 * Get purchases
	 *
	 * @return	\IPS\Patterns\ActiveRecordIterator
	 */
	public function get_purchases()
	{
		return new \IPS\Patterns\ActiveRecordIterator( \IPS\Db::i()->select( '*', 'nexus_purchases', array( array( 'ps_member=?', $this->main_id->member_id ), \IPS\Db::i()->in( 'ps_id', $this->purchaseIds() ) ) ), 'IPS\nexus\Purchase' );
	}
	
	/**
	 * Get purchase IDs
	 *
	 * @return	array
	 */
	public function purchaseIds()
	{
		return explode( ',', $this->_data['purchases'] );
	}
	
	/**
	 * Set purchases
	 *
	 * @param	array	$purchases	The purchases
	 * @return	void
	 */
	public function set_purchases( array $purchases )
	{
		$this->_data['purchases'] = implode( ',', array_keys( $purchases ) );
	}
	
	/**
	 * Save Changed Columns
	 *
	 * @return	void
	 */
	public function save()
	{
		if ( $this->_new )
		{
			$data = $this->_data;
		}
		else
		{
			$data = $this->changed;
		}
		
		foreach ( array_keys( static::$bitOptions ) as $k )
		{
			if ( $this->$k instanceof Bitwise )
			{
				foreach( $this->$k->values as $field => $value )
				{
					$data[ $field ] = intval( $value );
				}
			}
		}
	
		if ( $this->_new )
		{
			$insert = array();
			if( static::$databasePrefix === NULL )
			{
				$insert = $data;
			}
			else
			{
				$insert = array();
				foreach ( $data as $k => $v )
				{
					$insert[ static::$databasePrefix . $k ] = $v;
				}
			}

			$insertId = static::db()->insert( static::$databaseTable, $insert );
			
			$this->_new = FALSE;
		}
		elseif( !empty( $data ) )
		{
			/* Set the column names with a prefix */
			if( static::$databasePrefix === NULL )
			{
				$update = $data;
			}
			else
			{
				$update = array();
				foreach ( $data as $k => $v )
				{
					$update[ static::$databasePrefix . $k ] = $v;
				}
			}
						
			/* Work out the ID */
			$idColumn = static::$databaseColumnId;

			/* Save */
			static::db()->update( static::$databaseTable, $update, array( 'main_id=? AND alt_id=?', $this->main_id->member_id, $this->alt_id->member_id ) );
			
			/* Reset our log of what's changed */
			$this->changed = array();
		}
	}
	
	/**
	 * [ActiveRecord] Delete Record
	 *
	 * @return	void
	 */
	public function delete()
	{
		static::db()->delete( 'nexus_alternate_contacts', array( 'main_id=? AND alt_id=?', $this->_data['main_id'], $this->_data['alt_id'] ) );
	}
}