<?php
defined( 'ABSPATH' ) || exit;

class NASEO_Publisher {

    /**
     * Повний цикл: генерація → публікація → SEO → фото
     * Повертає post_id або false
     */
    public static function publish_item( object $item ) {
        global $wpdb;
        $table = $wpdb->prefix . 'naseo_queue';

        // Позначаємо як "processing"
        // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
        $wpdb->update( $table, [ 'status' => 'processing' ], [ 'id' => $item->id ] );

        $item_arr = [
            'title'        => $item->title,
            'keyword'      => $item->keyword,
            'lsi_keywords' => $item->lsi_keywords,
            'category'     => $item->category,
        ];

        // Генерація контенту
        $generator = new NASEO_AI_Generator();
        $generated = $generator->generate( $item_arr );

        if ( ! $generated ) {
            // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
            $wpdb->update( $table, [
                'status'    => 'error',
                'error_msg' => 'Помилка генерації через Claude API',
            ], [ 'id' => $item->id ] );
            return false;
        }

        // Визначаємо категорію
        $cat_id = self::get_or_create_category( $item->category );

        // Визначаємо автора
        $author_id = (int) get_option( 'naseo_author_id', get_current_user_id() );

        // Отримуємо 2 картинки через Pexels і вставляємо в текст
        $fetcher  = new NASEO_Image_Fetcher();
        $content  = $generated['content'];

        // Картинка 1 — замінюємо {{IMAGE_1}}
        $img1_id  = $fetcher->fetch_and_attach( $item->keyword, 0 );
        if ( $img1_id ) {
            $img1_html = wp_get_attachment_image( $img1_id, 'large', false, [
                'class' => 'naseo-inline-image aligncenter',
                'alt'   => esc_attr( $item->keyword ),
            ] );
            $content = str_replace( '{{IMAGE_1}}', $img1_html, $content );
        } else {
            $content = str_replace( '{{IMAGE_1}}', '', $content );
        }

        // Картинка 2 — замінюємо {{IMAGE_2}}
        $img2_id  = $fetcher->fetch_and_attach( $item->keyword, 0 );
        if ( $img2_id ) {
            $img2_html = wp_get_attachment_image( $img2_id, 'large', false, [
                'class' => 'naseo-inline-image aligncenter',
                'alt'   => esc_attr( $item->keyword ),
            ] );
            $content = str_replace( '{{IMAGE_2}}', $img2_html, $content );
        } else {
            $content = str_replace( '{{IMAGE_2}}', '', $content );
        }

        // Видаляємо h1 з тіла статті якщо він дублюється (залишаємо лише перший)
        $h1_count = 0;
        $content  = preg_replace_callback(
            '/<h1[^>]*>.*?<\/h1>/is',
            function( $match ) use ( &$h1_count ) {
                $h1_count++;
                // Перший h1 залишаємо, всі наступні видаляємо
                return $h1_count === 1 ? $match[0] : '';
            },
            $content
        );

        // Створюємо пост
        $post_id = wp_insert_post( [
            'post_title'    => sanitize_text_field( $item->title ),
            'post_content'  => wp_kses_post( $content ),
            'post_status'   => 'publish',
            'post_author'   => $author_id,
            'post_category' => $cat_id ? [ $cat_id ] : [],
            'post_type'     => 'post',
        ], true );

        if ( is_wp_error( $post_id ) ) {
            // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
            $wpdb->update( $table, [
                'status'    => 'error',
                'error_msg' => $post_id->get_error_message(),
            ], [ 'id' => $item->id ] );
            return false;
        }

        // SEO мета
        NASEO_SEO_Writer::write( $post_id, $generated );

        // Featured image — перша картинка стає мініатюрою
        if ( ! empty( $img1_id ) ) {
            set_post_thumbnail( $post_id, $img1_id );
        }

        // Позначаємо як опубліковано
        // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
        $wpdb->update( $table, [
            'status'  => 'published',
            'post_id' => $post_id,
        ], [ 'id' => $item->id ] );

        NASEO_Logger::log( 'success', "Опубліковано: {$item->title} (post #{$post_id})" );

        return $post_id;
    }

    private static function get_or_create_category( string $name ) {
        if ( empty( $name ) ) return false;

        $name = sanitize_text_field( $name );
        $term = get_term_by( 'name', $name, 'category' );

        if ( $term ) return $term->term_id;

        $result = wp_insert_term( $name, 'category' );
        return is_wp_error( $result ) ? false : $result['term_id'];
    }
}
