<?php
/**
 * Module Logs Site connector class.
 *
 * @package MainWP\Dashboard
 * @version 4.5.1
 */

namespace MainWP\Dashboard\Module\Log;

defined( 'ABSPATH' ) || exit;

/**
 * Class Connector_Site
 */
class Connector_Site extends Log_Connector {

    /**
     * Connector name.
     *
     * @var string Connector slug.
     */
    public $name = 'site';

    /**
     * Connector name.
     *
     * @var array Actions registered for this connector.
     **/
    public $actions = array(
        'mainwp_site_added', // site::added.
        'mainwp_site_updated', // site::updated.
        'mainwp_site_sync', // site::synced.
        'mainwp_site_deleted', // site::deleted.
        'mainwp_site_reconnected', // site::reconnected.
        'mainwp_site_suspended', // site::updated suspended value.
        'mainwp_site_tag_action',
        'mainwp_site_go_to_wpadmin',
    );

    /**
     * Return translated connector label.
     *
     * @return string Translated connector label.
     */
    public function get_label() {
        return esc_html__( 'Sites', 'mainwp' );
    }

    /**
     * Return translated action labels.
     *
     * @return array Action label translations.
     */
    public function get_action_labels() {
        return array(
            'added'     => esc_html__( 'Added', 'mainwp' ),
            'updated'   => esc_html__( 'Updated', 'mainwp' ),
            'sync'      => esc_html__( 'Sync Data', 'mainwp' ),
            'deleted'   => esc_html__( 'Deleted', 'mainwp' ),
            'suspend'   => esc_html__( 'Suspend', 'mainwp' ),
            'unsuspend' => esc_html__( 'Unsuspend', 'mainwp' ),
            'reconnect' => esc_html__( 'Reconnected', 'mainwp' ),
            'opensite'  => esc_html__( 'Go to WP Admin', 'mainwp' ),
        );
    }

    /**
     * Return translated context labels.
     *
     * @return array Context label translations.
     */
    public function get_context_labels() {
        return array(
            'sites' => esc_html__( 'Sites', 'mainwp' ),
        );
    }

    /**
     * Log site added process.
     *
     * @action transition_post_status.
     *
     * @param object $website Website object data.
     *
     * @return bool Return TRUE.
     */
    public function callback_mainwp_site_added( $website ) {
        if ( empty( $website ) || ! is_object( $website ) || empty( $website->id ) ) {
            return false;
        }
        $state = 1;
        $this->log(
            '%1$s',
            array(
                'item' => esc_html__( 'Added', 'mainwp' ),
            ),
            $website->id,
            'sites',
            'added',
            $state
        );
        return true;
    }

    /**
     * Log site sync process.
     *
     * @param object $website Website object data.
     * @param array  $information Sync array data.
     * @param bool   $success Sync success or failed.
     * @param string $sync_error Sync error data (options).
     *
     * @return bool Return TRUE.
     */
    public function callback_mainwp_site_sync( $website, $information, $success, $sync_error = '' ) {
        unset( $information );
        if ( empty( $website ) ) {
            return false;
        }

        $action = 'sync';
        $state  = null;
        if ( $success ) {
            $message = '%1$s';
            $state   = 1;
        } else {
            $message = '%1$s';
            $state   = 0;
        }

        $args = array(
            'item' => esc_html__( 'Sync Data', 'mainwp' ),
        );

        if ( ! empty( $sync_error ) ) {
            $info               = array(
                'sync_error' => $sync_error,
            );
            $args['extra_info'] = wp_json_encode( $info );
        }

        $this->log(
            $message,
            $args,
            $website->id,
            'sites',
            $action,
            $state
        );

        return true;
    }


    /**
     * Log site sync process.
     *
     * @action transition_post_status.
     *
     * @param object $website Website object data.
     *
     * @return bool Return TRUE.
     */
    public function callback_mainwp_site_deleted( $website ) {
        $state = 1;
        $this->log(
            '%1$s',
            array(
                'item' => esc_html__( 'Deleted', 'mainwp' ),
            ),
            $website->id,
            'sites',
            'deleted',
            $state
        );
        return true;
    }

    /**
     * Log site sync process.
     *
     * @action transition_post_status.
     *
     * @param object $website Website object data.
     * @param bool   $success success or not.
     * @param string $error reconnect error.
     *
     * @return bool Return TRUE.
     */
    public function callback_mainwp_site_reconnected( $website, $success = true, $error = '' ) {
        $message = '%1$s';

        $args = array(
            'item' => esc_html__( 'Reconnect', 'mainwp' ),
        );

        if ( ! empty( $error ) ) {
            $other              = array(
                'error' => $error,
            );
            $args['extra_info'] = wp_json_encode( $other );
        }

        $state = $success ? 1 : 0;
        $this->log(
            $message,
            $args,
            $website->id,
            'sites',
            'reconnect',
            $state
        );
        return true;
    }


    /**
     * Log site updated process.
     *
     * @action transition_post_status.
     *
     * @param object $website Website object data.
     *
     * @return bool Return TRUE.
     */
    public function callback_mainwp_site_updated( $website ) {
        $state = 1;
        $this->log(
            '%1$s',
            array(
                'item' => esc_html__( 'Updated', 'mainwp' ),
            ),
            $website->id,
            'sites',
            'updated',
            $state
        );
        return true;
    }

    /**
     * Log site updated suspended process.
     *
     * @action mainwp_site_suspended.
     *
     * @param object $website Website object data.
     * @param int    $suspended suspended value.
     *
     * @return bool Return TRUE.
     */
    public function callback_mainwp_site_suspended( $website, $suspended ) {

        $action = $suspended ? 'suspend' : 'unsuspend';

        if ( $suspended ) {
            $message = '%1$s';
            $args    = array(
                'item' => esc_html__( 'Suspend', 'mainwp' ),
            );
        } else {
            $message = '%1$s';
            $args    = array(
                'item' => esc_html__( 'Unsuspend', 'mainwp' ),
            );
        }

        $args['siteurl']   = $website->url;
        $args['site_name'] = $website->name;

        $state = 1;
        $this->log(
            $message,
            $args,
            $website->id,
            'sites',
            $action,
            $state
        );
        return true;
    }


    /**
     * Log Tag actions.
     *
     * @action mainwp_site_tag_action.
     *
     * @param object $tag tag object data.
     * @param string $action tag action.
     * @param array  $data other data array (option).
     *
     * @return bool Return TRUE.
     */
    public function callback_mainwp_site_tag_action( $tag, $action, $data = array() ) {

        if ( empty( $tag ) || ! is_string( $action ) || ! in_array( $action, array( 'created', 'updated', 'deleted' ), true ) ) {
            return false;
        }

        $args = array(
            'name' => $tag->name,
        );

        if ( 'created' === $action || 'deleted' === $action ) {
            $message = '%1$s';
        } elseif ( 'updated' === $action ) {
            $message = '%1$s';
            $args    = array(
                'name'     => $tag->name,
                'old_name' => is_array( $data ) && isset( $data['old_name'] ) ? $data['old_name'] : '',
            );
        } else {
            return fase;
        }

        $state = 1;

        $this->log(
            $message,
            $args,
            0,
            'tags',
            $action,
            $state
        );
        return true;
    }

    /**
     * Go to wp admin actions.
     *
     * @param  mixed $website The site.
     * @param  mixed $location Location.
     * @param  mixed $params Other params.
     *
     * @return void.
     */
    public function callback_mainwp_site_go_to_wpadmin( $website, $location, $params = array() ) { //phpcs:ignore -- NOSONAR - unuse $location.

        if ( empty( $website ) || ! is_object( $website ) || empty( $website->id ) ) {
            return;
        }

        $user = wp_get_current_user();

        if ( empty( $user ) ) {
            return;
        }

        if ( ! is_array( $params ) ) {
            $params = array();
        }

        $message = '%1$s';

        $args = array(
            'item' => esc_html__( 'Go to WP Admin', 'mainwp' ),
        );

        $action = 'opensite';

        $this->log(
            $message,
            $args,
            $website->id,
            'sites',
            $action
        );
    }
}
