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

namespace MainWP\Dashboard\Module\Log;

defined( 'ABSPATH' ) || exit;

/**
 * Class Connector_Installer
 *
 * @package MainWP\Dashboard
 */
class Connector_Installer extends Log_Connector {

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

    /**
     * Actions names.
     *
     * @var array Actions registered for this connector.
     * */
    public $actions = array(
        'mainwp_install_update_actions',
        'mainwp_install_plugin_action', // call child function: plugin_action.
        'mainwp_install_theme_action', // call child function: theme_action.
    );


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

    /**
     * Return translated action labels.
     *
     * @return array Action label translations.
     */
    public function get_action_labels() {
        return array(
            'install'    => esc_html__( 'Installed', 'mainwp' ),
            'activate'   => esc_html__( 'Activated', 'mainwp' ),
            'deactivate' => esc_html__( 'Deactivated', 'mainwp' ),
            'delete'     => esc_html__( 'Deleted', 'mainwp' ),
            'updated'    => esc_html__( 'Updated', 'mainwp' ),
        );
    }

    /**
     * Return translated context labels.
     *
     * @return array Context label translations.
     */
    public function get_context_labels() {
        return array(
            'plugins'     => esc_html__( 'Plugins', 'mainwp' ),
            'themes'      => esc_html__( 'Themes', 'mainwp' ),
            'core'        => esc_html__( 'Core', 'mainwp' ),
            'translation' => esc_html__( 'Translation', 'mainwp' ),
        );
    }

    /**
     * Log plugin|theme installations.
     *
     * @action mainwp_install_update_actions.
     *
     * @param object $website  website.
     * @param string $pAction install action.
     * @param array  $data data result.
     * @param string $type action type.
     * @param mixed  $post_data post data (option).
     * @param bool   $upload true|false install by upload.
     */
    public function callback_mainwp_install_update_actions( $website, $pAction, $data, $type, $post_data = array(), $upload = false ) { //phpcs:ignore -- NOSONAR - complex method.

        if ( empty( $website ) || empty( $pAction ) || ! is_string( $pAction ) || ! is_array( $data ) ) {
            return;
        }

        if ( ! in_array( $pAction, array( 'install', 'updated' ), true ) ) {
            return;
        }

        $context = '';

        if ( 'plugin' === $type ) {
            $context = 'plugin';
        } elseif ( 'theme' === $type ) {
            $context = 'theme';
        } elseif ( 'trans' === $type ) {
            $context = 'translation';
        } elseif ( 'core' === $type ) {
            $context = 'core';
        } else {
            return;
        }

        $logs_args = array();

        $action = $pAction;

        $args = array();

        if ( 'install' === $action ) {

            $installed_items = isset( $data['install_items'] ) ? $data['install_items'] : array();

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

            if ( empty( $installed_items ) ) {
                return false;
            }

            foreach ( $installed_items as $item ) {
                $item = $this->sanitize_data( $item );
                if ( ! empty( $item ) && isset( $item['name'] ) ) {
                    $args        = array(
                        'name'       => $item['name'],
                        'version'    => $item['version'],
                        'upload'     => $upload ? 1 : 0,
                        'extra_info' => $item,
                    );
                    $logs_args[] = $args;
                }
            }

            if ( empty( $logs_args ) ) {
                return false;
            }

            $message = '%1$s';

        } elseif ( 'updated' === $action && ( in_array( $type, array( 'plugin', 'theme', 'trans' ) ) ) ) {

            $updated_data = isset( $data['updated_data'] ) ? $data['updated_data'] : array();

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

            $logs_args = array();

            foreach ( $updated_data as $item ) {
                $item = $this->sanitize_data( $item );
                if ( ! empty( $item ) && isset( $item['name'] ) ) {
                    $args = array(
                        'name' => $item['name'],
                    );
                    if ( isset( $item['version'] ) ) {
                        $args['version'] = $item['version'];
                    }
                    $save_info = $item;
                    if ( ! empty( $item['rollback'] ) ) {
                        $save_info['rollback_info'] = $item;
                    }
                    $args['extra_info'] = $save_info;
                    $logs_args[]        = $args;
                }
            }

            if ( empty( $logs_args ) ) {
                return false;
            }

            if ( 'plugin' === $type || 'theme' === $type || 'trans' === $type ) {
                $message = '%1$s';
            } else {
                return;
            }
        } elseif ( 'updated' === $action && 'core' === $type ) {
            $message     = '%1$s';
            $args        = array(
                'name'        => 'WordPress', // label.
                'version'     => isset( $data['version'] ) ? $data['version'] : '',
                'old_version' => isset( $data['old_version'] ) ? $data['old_version'] : '',
                'error'       => isset( $data['error'] ) ? $data['error'] : '',
            );
            $logs_args[] = $args;

        } else {
            return false;
        }

        $count_bulk = count( $logs_args );
        foreach ( $logs_args as $args ) {
            $args['duration_bulk'] = $count_bulk;

            $state = 1;
            if ( isset( $args['extra_info'] ) && is_array( $args['extra_info'] ) ) {
                if ( isset( $args['extra_info']['success'] ) ) {
                    $state = ! empty( $args['extra_info']['success'] ) ? 1 : 0;
                }
                $args['extra_info'] = wp_json_encode( $args['extra_info'] );
            }
            $this->log(
                $message,
                $args,
                $website->id,
                $context,
                $action,
                $state
            );
        }

        return true;
    }

    /**
     * Log plugin actions.
     *
     * @action mainwp_install_plugin_action.
     *
     * @param array  $website  website.
     * @param string $plugin_act plugin action: activate, deactivate, delete.
     * @param array  $params params array.
     * @param array  $action_data response data.
     */
    public function callback_mainwp_install_plugin_action( $website, $plugin_act, $params, $action_data ) { // phpcs:ignore -- NOSONAR - complex method.

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

        if ( ! in_array( $plugin_act, array( 'activate', 'delete', 'deactivate' ), true ) ) {
            return;
        }

        if ( ! is_array( $action_data ) ) {
            return;
        }

        $logs_args = array();

        foreach ( $action_data as $item ) {
            $item = $this->sanitize_data( $item );
            if ( ! empty( $item ) && isset( $item['name'] ) ) {
                $log_arg = array(
                    'name'    => $item['name'],
                    'version' => $item['version'],
                    'slug'    => $item['slug'],
                );
                if ( ! empty( $item['created'] ) ) {
                    $log_arg['created'] = $item['created'];
                }
                $logs_args[] = $log_arg;
            }
        }

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

        $action  = $plugin_act;
        $context = 'plugin';

        $message = '%1$s';

        $state = 1;

        foreach ( $logs_args as $args ) {
            $args['duration_bulk'] = is_array( $params ) && ! empty( $params['duration_bulk'] ) ? $params['duration_bulk'] : count( $logs_args );
            $this->log(
                $message,
                $args,
                $website->id,
                $context,
                $action,
                $state
            );
        }
    }

    /**
     * Log themes actions.
     *
     * @action mainwp_install_theme_action.
     *
     * @param array  $website  website.
     * @param string $theme_act theme action: activate, delete.
     * @param array  $params params array.
     * @param array  $action_data response data.
     */
    public function callback_mainwp_install_theme_action( $website, $theme_act, $params, $action_data ) {

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

        if ( ! in_array( $theme_act, array( 'activate', 'delete', 'deactivate' ), true ) ) {
            return;
        }

        if ( ! is_array( $action_data ) ) {
            return;
        }

        $logs_args = array();

        foreach ( $action_data as $item ) {
            $item = $this->sanitize_data( $item );
            if ( ! empty( $item ) && isset( $item['name'] ) ) {
                $logs_args[] = array(
                    'name'    => $item['name'],
                    'version' => $item['version'],
                    'slug'    => $item['slug'],
                );
            }
        }

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

        $action  = $theme_act;
        $context = 'theme';

        $message = '%1$s';

        $state = 1;

        $count_bulk = count( $logs_args );
        foreach ( $logs_args as $args ) {
            $args['duration_bulk'] = $count_bulk;
            $this->log(
                $message,
                $args,
                $website->id,
                $context,
                $action,
                $state
            );
        }
    }
}
