<?php
/**
 * Created by PhpStorm.
 * User: alex
 * Date: 2/7/19
 * Time: 10:13 AM
 */


class Brizy_Editor_Accounts_Api extends Brizy_Admin_AbstractApi {

	const nonce = 'brizy-api';
	const BRIZY_GET_ACCOUNT = '_get_account';
	const BRIZY_GET_ACCOUNTS = '_get_accounts';
	const BRIZY_ADD_ACCOUNT = '_add_account';
	const BRIZY_UPDATE_ACCOUNT = '_update_account';
	const BRIZY_DELETE_ACCOUNT = '_delete_account';

	/**
	 * @var Brizy_Editor_Accounts_ServiceAccountManager
	 */
	private $manager;

	/**
	 * Brizy_Admin_Rules_Api constructor.
	 *
	 * @param Brizy_Editor_Accounts_ServiceAccountManager $manager
	 */
	public function __construct( $manager ) {
		$this->manager = $manager;

		parent::__construct();
	}

	/**
	 * @return Brizy_Editor_Accounts_Api
	 * @throws Exception
	 */
	public static function _init() {
		static $instance;

		if ( ! $instance ) {
			$instance = new self( new Brizy_Editor_Accounts_ServiceAccountManager( Brizy_Editor_Project::get() ) );
		}

		return $instance;
	}

	/***
	 * @return null
	 */
	protected function getRequestNonce() {
		return $this->param( 'hash' );
	}

	/**
	 * Register all api actions
	 */
	protected function initializeApiActions() {
		$pref = 'wp_ajax_' . Brizy_Editor::prefix();
		add_action( $pref . self::BRIZY_GET_ACCOUNT, array( $this, 'actionGetAccount' ) );
		add_action( $pref . self::BRIZY_GET_ACCOUNTS, array( $this, 'actionGetAccounts' ) );
		add_action( $pref . self::BRIZY_ADD_ACCOUNT, array( $this, 'actionAddAccount' ) );
		add_action( $pref . self::BRIZY_UPDATE_ACCOUNT, array( $this, 'actionUpdateAccount' ) );
		add_action( $pref . self::BRIZY_DELETE_ACCOUNT, array( $this, 'actionDeleteAccount' ) );
	}


	public function actionGetAccount() {
		$this->verifyAuthorization( self::nonce );
		if ( ! $this->param( 'id' ) ) {
			$this->error( 400, 'Invalid account id' );
		}
		try {
			$manager = new Brizy_Editor_Accounts_ServiceAccountManager( Brizy_Editor_Project::get() );
			$account = $manager->getAccount( $this->param( 'id' ) );

			if ( ! $account ) {
				$this->error( 404, 'Account not found' );
			}

			$this->success( $account );
		} catch ( Exception $e ) {
			Brizy_Logger::instance()->critical( $e->getMessage(), array( $e ) );
			$this->error( 500, $e->getMessage() );
		}
	}


	public function actionGetAccounts() {
		$this->verifyAuthorization( self::nonce );

		$filter = array();

		if ( $this->param( 'group' ) ) {
			$filter['group'] = $this->param( 'group' );
		}
		if ( $this->param( 'service' ) ) {
			$filter['service'] = $this->param( 'service' );
		}

		try {
			$manager  = new Brizy_Editor_Accounts_ServiceAccountManager( Brizy_Editor_Project::get() );
			$accounts = $manager->getFilteredAccounts( $filter );
			$this->success( $accounts );
		} catch ( Exception $e ) {
			Brizy_Logger::instance()->critical( $e->getMessage(), array( $e ) );
			$this->error( 500, $e->getMessage() );
		}
	}

	public function actionAddAccount() {
		$this->verifyAuthorization( self::nonce );
		try {
			$manager  = new Brizy_Editor_Accounts_ServiceAccountManager( Brizy_Editor_Project::get() );
			$instance = Brizy_Editor_Accounts_AbstractAccount::createFromJson( json_decode( file_get_contents( 'php://input' ) ) );
			$instance->validate();
			$manager->addAccount( $instance );
			$this->success( $instance );
		} catch ( Exception $e ) {
			Brizy_Logger::instance()->critical( $e->getMessage(), array( $e ) );
			$this->error( 500, $e->getMessage() );
		}
	}

	public function actionUpdateAccount() {
		$this->verifyAuthorization( self::nonce );
		try {
			$manager  = new Brizy_Editor_Accounts_ServiceAccountManager( Brizy_Editor_Project::get() );
			$instance = Brizy_Editor_Accounts_AbstractAccount::createFromJson( json_decode( file_get_contents( 'php://input' ) ) );
			$manager->updateAccount( $instance );
			$this->success( $instance );
		} catch ( Exception $e ) {
			Brizy_Logger::instance()->critical( $e->getMessage(), array( $e ) );
			$this->error( 500, $e->getMessage() );
		}
	}

	public function actionDeleteAccount() {
		$this->verifyAuthorization( self::nonce );
		try {

			if ( ! $this->param( 'id' ) ) {
				$this->error( 400, 'Invalid account id' );
			}

			$manager = new Brizy_Editor_Accounts_ServiceAccountManager( Brizy_Editor_Project::get() );
			$manager->deleteAccountById( $this->param( 'id' ) );
			$this->success( null );
		} catch ( Exception $e ) {
			Brizy_Logger::instance()->critical( $e->getMessage(), array( $e ) );
			$this->error( 500, $e->getMessage() );
		}
	}

}