<?php
/**
 * Created by PhpStorm.
 * User: alex
 * Date: 7/18/18
 * Time: 10:48 AM
 */


class Brizy_Admin_Fonts_Api extends Brizy_Admin_AbstractApi {

	const nonce = 'brizy-api';

	const AJAX_CREATE_FONT_ACTION = '-create-font';
	const AJAX_DELETE_FONT_ACTION = '-delete-font';
	const AJAX_GET_FONTS_ACTION = '-get-fonts';

	/**
	 * @var Brizy_Admin_Fonts_Manager
	 */
	private $fontManager;

	/**
	 * @return Brizy_Admin_Fonts_Api
	 */
	public static function _init() {
		static $instance;

		if ( ! $instance ) {
			$instance = new self();
		}

		return $instance;
	}

	/**
	 * Brizy_Admin_Fonts_Api constructor.
	 */
	public function __construct() {

		$this->fontManager = new Brizy_Admin_Fonts_Manager();
		parent::__construct();
	}

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

	protected function initializeApiActions() {
		$pref = 'wp_ajax_' . Brizy_Editor::prefix();
		add_action( $pref . self::AJAX_CREATE_FONT_ACTION, array( $this, 'actionCreateFont' ) );
		add_action( $pref . self::AJAX_DELETE_FONT_ACTION, array( $this, 'actionDeleteFont' ) );
		add_action( $pref . self::AJAX_GET_FONTS_ACTION, array( $this, 'actionGetFonts' ) );
	}

	public function actionGetFonts() {

		$this->verifyAuthorization( self::nonce );

		$manager = new Brizy_Admin_Fonts_Manager();

		$this->success( $manager->getAllFonts() );
	}

	public function actionCreateFont() {
		try {

			$this->verifyAuthorization( self::nonce );

			if ( ! ( $fontUidId = $this->param( 'id' ) ) ) {
				$this->error( 400, 'Invalid font uid' );
			}

			if ( ! ( $family = $this->param( 'family' ) ) ) {
				$this->error( 400, 'Invalid font family' );
			}

			if ( ! ( $fontType = $this->param( 'type' ) ) ) {
				$fontType = 'uploaded';
			}

			if ( ! isset( $_FILES['fonts'] ) ) {
				$this->error( 400, 'Invalid font files' );
			}

			$existingFont = $this->fontManager->getFontByFamily( $fontUidId, $family, $fontType );

			if ( $existingFont ) {
				$this->error( 400, 'This font family already exists.' );
			}

			try {

				$files = array();
				// create font attachments
				foreach ( $_FILES['fonts']['name'] as $weight => $attachments ) {
					foreach ( $attachments as $type => $file ) {
						$files[ $weight ][ $type ] = array(
							'name'     => $_FILES['fonts']['name'][ $weight ][ $type ],
							'type'     => $_FILES['fonts']['type'][ $weight ][ $type ],
							'tmp_name' => $_FILES['fonts']['tmp_name'][ $weight ][ $type ],
							'error'    => $_FILES['fonts']['error'][ $weight ][ $type ],
							'size'     => $_FILES['fonts']['size'][ $weight ][ $type ]
						);
					}
				}

				$fontPostId = $this->fontManager->createFont( $fontUidId, $family, $files, $fontType );
			} catch ( Exception $e ) {
				Brizy_Logger::instance()->debug( 'Create font ERROR', [ $e ] );
				$this->error( 400, $e->getMessage() );
			}

			$fontUidId = get_post_meta( $fontPostId, 'brizy_post_uid', true );

			$font = $this->fontManager->getFont( $fontUidId );

			$this->success( $font );

		} catch ( Exception $exception ) {
			Brizy_Logger::instance()->critical( $exception->getMessage(), [ $exception ] );
			$this->error( 400, $exception->getMessage() );
		}
	}

	public function actionDeleteFont() {

		$this->verifyAuthorization( self::nonce );

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

		$manager = new Brizy_Admin_Fonts_Manager();

		try {
			$manager->deleteFont( $fontId );
		} catch ( Exception $exception ) {
			Brizy_Logger::instance()->critical( $exception->getMessage(), [ $exception ] );
			$this->error( $exception->getCode(), $exception->getMessage() );
		}

		$this->success( [] );
	}
}