<?php
/**
 * File containing the Email_Seeder class.
 *
 * @package sensei
 */

namespace Sensei\Internal\Emails;

use Sensei\Internal\Emails\Email_Seeder_Data;
use Sensei\Internal\Emails\Email_Repository;

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Email_Seeder class.
 *
 * @internal
 *
 * @since 4.12.0
 */
class Email_Seeder {
	/**
	 * Email_Seeder_Data instance.
	 *
	 * @var Email_Seeder_Data
	 */
	private $email_data;

	/**
	 * Email repository.
	 *
	 * @var Email_Repository
	 */
	private $email_repository;

	/**
	 * Email data.
	 *
	 * @var array
	 */
	private $emails;

	/**
	 * Template_Wizard constructor.
	 *
	 * @internal
	 *
	 * @param Email_Seeder_Data $email_data Email_Seeder_Data instance. Keeps information about all default emails.
	 * @param Email_Repository  $email_repository Email repository.
	 */
	public function __construct( Email_Seeder_Data $email_data, Email_Repository $email_repository ) {
		$this->email_data       = $email_data;
		$this->email_repository = $email_repository;
		$this->emails           = [];
	}

	/**
	 * Initialize the wizard.
	 *
	 * @internal
	 */
	public function init() {
		/**
		 * Filter the email data.
		 *
		 * @since 4.12.0
		 *
		 * @hook sensei_email_seeder_data
		 *
		 * @param {array} $emails Email data.
		 * @return {array} Filtered array of email data.
		 */
		$this->emails = apply_filters( 'sensei_email_seeder_data', $this->email_data->get_email_data() );
	}

	/**
	 * Create email.
	 *
	 * @internal
	 *
	 * @param string $identifier Email identifier.
	 * @param bool   $force      Force creation.
	 *
	 * @return bool
	 */
	public function create_email( string $identifier, bool $force = false ): bool {
		$email_exists = $this->email_repository->has( $identifier );
		if ( $email_exists ) {
			if ( ! $force ) {
				return false;
			}

			$this->email_repository->delete( $identifier );
		}

		$email_data = $this->emails[ $identifier ] ?? [];
		if ( empty( $email_data ) ) {
			return false;
		}

		$types = $email_data['types'] ?? [];
		if ( empty( $types ) ) {
			return false;
		}

		$subject = $email_data['subject'] ?? '';
		if ( empty( $subject ) ) {
			return false;
		}

		$content = $email_data['content'] ?? '';
		if ( empty( $content ) ) {
			return false;
		}

		$description = $email_data['description'] ?? '';

		$is_pro   = $email_data['is_pro'] ?? false;
		$disabled = $email_data['disabled'] ?? false;

		$email_id = $this->email_repository->create( $identifier, $types, $subject, $description, $content, $is_pro, $disabled );

		return is_int( $email_id ) && $email_id > 0;
	}

	/**
	 * Create all emails from templates.
	 *
	 * @internal
	 *
	 * @param bool $force Delete an old email if exists and re-create it with default data.
	 * @return bool
	 */
	public function create_all( $force = false ): bool {
		$result = true;
		foreach ( $this->get_email_identifiers() as $type ) {
			$last_result = $this->create_email( $type, $force );
			if ( ! $last_result ) {
				$result = false;
			}
		}
		return $result;
	}

	/**
	 * Get all available email identifiers.
	 *
	 * @return array
	 */
	private function get_email_identifiers(): array {
		return array_keys( $this->emails );
	}
}
