<?php
/*
Plugin Name: One Click WP Setup
Description: 一括で指定プラグインをインストール&有効化し、基本設定(年表示、ACFフィールド、簡易つぶやきCPT、ショートコード)を行います。テスト環境で必ず確認してください。
Version: 1.0
Author: ChatGPT
*/

if (!defined(‘ABSPATH’)) exit;

class OneClickWPSetup {
private $slug_list = array(
‘list-category-posts’, // List Category Posts
‘relevanssi’, // Relevanssi
‘advanced-custom-fields’, // Advanced Custom Fields (ACF)
‘microblog-poster’ // Microblog Poster (may not exist in WP repo; adjust if needed)
);

public function __construct() {
    add_action('admin_menu', array($this, 'admin_menu'));
    add_action('admin_post_ocwps_run', array($this, 'handle_run'));
    add_action('init', array($this, 'register_microblog_cpt'));
    add_shortcode('microblog', array($this, 'shortcode_microblog'));
    add_shortcode('today_message', array($this, 'shortcode_today_message'));
}

public function admin_menu() {
    add_menu_page('WP セットアップ', 'WP セットアップ', 'manage_options', 'ocwps', array($this, 'admin_page'), 'dashicons-admin-generic', 55);
}

public function admin_page() {
    if (!current_user_can('manage_options')) return;
    ?>
    <div class="wrap">
        <h1>One Click WP Setup</h1>
        <p>選択したプラグインを WP.org からインストール → 有効化し、基本設定を行います。</p>

        <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>">
            <?php wp_nonce_field('ocwps_run_nonce'); ?>
            <input type="hidden" name="action" value="ocwps_run">
            <h2>インストール対象プラグイン(チェックで実行)</h2>
            <?php foreach ($this->slug_list as $slug): ?>
                <label style="display:block;margin:6px 0;">
                    <input type="checkbox" name="plugins[]" value="<?php echo esc_attr($slug); ?>" checked>
                    <?php echo esc_html($slug); ?>
                </label>
            <?php endforeach; ?>
            <p><strong>注意:</strong>スラッグが WP.org にないプラグインは失敗します。その際は手動でインストールしてください。</p>
            <p><button class="button button-primary" type="submit">一括セットアップ実行</button></p>
        </form>

        <hr>
        <h2>今日の一言(管理)</h2>
        <form method="post" action="<?php echo admin_url('options.php'); ?>">
            <?php settings_fields('ocwps_opts'); do_settings_sections('ocwps_opts'); ?>
            <table class="form-table">
                <tr valign="top">
                    <th scope="row">今日の一言</th>
                    <td><input type="text" name="ocwps_today_message" value="<?php echo esc_attr(get_option('ocwps_today_message','')); ?>" style="width:50%"></td>
                </tr>
            </table>
            <?php submit_button('保存'); ?>
        </form>

        <p>ショートコード:</p>
        <ul>
            <li>[today_message] — 今日の一言を表示</li>
            <li>[microblog count="5"] — つぶやき(microblog 投稿)を表示</li>
        </ul>

    </div>
    <?php
}

public function handle_run() {
    if (!current_user_can('manage_options')) wp_die('権限が必要です');
    check_admin_referer('ocwps_run_nonce');

    if (empty($_POST['plugins']) || !is_array($_POST['plugins'])) {
        wp_redirect(add_query_arg('ocwps_result','no_plugins', wp_get_referer()));
        exit;
    }

    // load required files for plugin install
    require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
    require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
    require_once ABSPATH . 'wp-admin/includes/file.php';
    require_once ABSPATH . 'wp-admin/includes/misc.php';
    require_once ABSPATH . 'wp-admin/includes/plugin.php';

    $upgrader = new Plugin_Upgrader(new Automatic_Upgrader_Skin());

    $results = array();

    foreach ($_POST['plugins'] as $slug) {
        $slug = sanitize_text_field($slug);
        // check if installed
        $installed_plugins = get_plugins();
        $found = false;
        foreach ($installed_plugins as $path => $plugin_data) {
            if (strpos($path, $slug) !== false || strpos($plugin_data['TextDomain'], $slug) !== false) {
                $found = true;
                // activate
                $activate = activate_plugin($path);
                $results[$slug] = is_wp_error($activate) ? $activate->get_error_message() : 'activated';
                break;
            }
        }
        if ($found) continue;

        // try to find plugin in WP.org
        $api = plugins_api('plugin_information', array('slug' => $slug, 'fields' => array('sections' => false)));
        if (is_wp_error($api)) {
            // not found on WP.org
            $results[$slug] = 'not_found_in_wporg';
            continue;
        }
        // install
        $package = $api->download_link;
        $installed = $upgrader->install($package);
        if ($installed === true || $upgrader->result) {
            // try to activate by scanning installed plugins
            $installed_plugins = get_plugins();
            foreach ($installed_plugins as $path => $plugin_data) {
                if (strpos($path, $slug) !== false) {
                    $activate = activate_plugin($path);
                    $results[$slug] = is_wp_error($activate) ? $activate->get_error_message() : 'installed_and_activated';
                    break;
                }
            }
            if (!isset($results[$slug])) $results[$slug] = 'installed_but_activation_failed';
        } else {
            $results[$slug] = 'install_failed';
        }
    }

    // basic settings:
    // 1) 日付表示を年のみ (Y)
    update_option('date_format', 'Y');

    // 2) If Relevanssi active, try to build index (best-effort)
    if (function_exists('relevanssi_build_index')) {
        // older/newer versions may have different function names; try action
        try {
            do_action('relevanssi_build_index');
            $results['relevanssi_index'] = 'triggered';
        } catch (Exception $e) {
            $results['relevanssi_index'] = 'failed_to_trigger';
        }
    }

    // 3) If ACF active, register a local field group for "今日の一言"
    if (function_exists('acf_add_local_field_group')) {
        acf_add_local_field_group(array(
            'key' => 'group_ocwps_today',
            'title' => '今日の一言',
            'fields' => array(
                array(
                    'key' => 'field_ocwps_today_text',
                    'label' => '今日の一言',
                    'name' => 'ocwps_today_text',
                    'type' => 'text',
                    'instructions' => 'フロントで表示する短いメッセージ',
                    'required' => 0,
                ),
            ),
            'location' => array(
                array(
                    array(
                        'param' => 'options_page',
                        'operator' => '==',
                        'value' => 'acf-options',
                    ),
                ),
            ),
        ));
        $results['acf_field'] = 'registered_local_field_group';
    } else {
        $results['acf_field'] = 'acf_not_active';
    }

    // 4) Create an option for today message fallback (if not using ACF)
    if (!get_option('ocwps_today_message')) update_option('ocwps_today_message', '');

    // redirect back with results (serialize)
    $url = add_query_arg('ocwps_result', rawurlencode(json_encode($results)), wp_get_referer());
    wp_redirect($url);
    exit;
}

// simple custom post type for micro-posts (つぶやき)
public function register_microblog_cpt() {
    $labels = array(
        'name' => 'つぶやき',
        'singular_name' => 'つぶやき',
    );
    $args = array(
        'labels' => $labels,
        'public' => true,
        'has_archive' => false,
        'supports' => array('title','editor','author'),
        'menu_position' => 20,
        'menu_icon' => 'dashicons-format-chat',
    );
    register_post_type('microblog', $args);
}

public function shortcode_microblog($atts) {
    $atts = shortcode_atts(array('count' => 5), $atts, 'microblog');
    $q = new WP_Query(array('post_type' => 'microblog', 'posts_per_page' => intval($atts['count'])));
    $out = '<div class="ocwps-microblog">';
    if ($q->have_posts()) {
        $out .= '<ul>';
        while ($q->have_posts()) {
            $q->the_post();
            $out .= '<li><strong>' . get_the_title() . '</strong><div>' . get_the_excerpt() . '</div><small>' . get_the_date() . '</small></li>';
        }
        $out .= '</ul>';
    } else {
        $out .= '<p>つぶやきがありません。</p>';
    }
    wp_reset_postdata();
    $out .= '</div>';
    return $out;
}

public function shortcode_today_message() {
    // Prefer ACF field if exists, else fallback to option
    if (function_exists('get_field')) {
        $msg = get_field('ocwps_today_text', 'option');
        if ($msg) return esc_html($msg);
    }
    $msg = get_option('ocwps_today_message','');
    return esc_html($msg);
}

}

new OneClickWPSetup();

// register the options for today’s message (so the settings form works)
add_action(‘admin_init’, function(){
register_setting(‘ocwps_opts’,’ocwps_today_message’);
});