<?php

namespace Elementor\Modules\GlobalClasses\Database\Migrations;

use Elementor\Core\Database\Base_Migration;
use Elementor\Core\Kits\Documents\Kit;
use Elementor\Modules\GlobalClasses\Concerns\Has_Kit_Dependency;
use Elementor\Modules\GlobalClasses\Global_Class_Post_Type;
use Elementor\Modules\GlobalClasses\Global_Classes_Order;
use Elementor\Modules\GlobalClasses\Global_Classes_Relations;
use Elementor\Modules\GlobalClasses\Global_Classes_Repository;
use Elementor\Modules\GlobalClasses\Utils\Global_Class_Data_Normalizer;
use Elementor\Plugin;

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

class Migrate_To_Posts extends Base_Migration {
	use Has_Kit_Dependency;

	public function up() {
		Global_Class_Post_Type::ensure_registered();

		$migrated = $this->migrate_global_classes_to_posts();

		if ( ! $migrated ) {
			return;
		}

		self::run_document_tracking( $this->get_kit() );

		// We'll comment it out for now as we may prefer to avoid data restoration upon downgrading
		// $this->cleanup_kit_meta();
	}

	private function migrate_global_classes_to_posts(): bool {
		$kit = $this->get_kit();
		if ( ! $kit ) {
			return false;
		}

		$global_classes = self::get_aggregate_global_classes( $kit );

		if ( empty( $global_classes ) || empty( $global_classes['items'] ) ) {
			return false;
		}

		$existing_posts = $this->get_existing_class_posts();

		if ( ! empty( $existing_posts ) ) {
			return false;
		}

		$raw_items = $global_classes['items'];
		$order = $global_classes['order'] ?? array_keys( $raw_items );

		$items = Global_Class_Data_Normalizer::normalize_styles( $raw_items );

		Global_Classes_Repository::make( $kit )->put( $items, $order );

		return true;
	}

	private function get_existing_class_posts(): array {
		return get_posts( [
			'post_type' => Global_Class_Post_Type::CPT,
			'post_status' => 'publish',
			'posts_per_page' => -1,
			'fields' => 'ids',
		] );
	}

	public static function get_aggregate_global_classes( ?Kit $kit = null ): array {
		$empty_result = [
			'items' => [],
			'order' => [],
		];

		if ( ! $kit ) {
			return $empty_result;
		}

		return $kit->get_json_meta( Global_Classes_Repository::META_KEY_FRONTEND ) ?? $empty_result;
	}

	public static function run_document_tracking( ?Kit $kit ): void {
		if ( ! $kit ) {
			return;
		}

		$valid_class_ids = Global_Classes_Order::make( $kit )->get_order();

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

		$relations = new Global_Classes_Relations();

		Plugin::$instance->db->iterate_elementor_documents(
			function ( $document ) use ( $relations, $valid_class_ids ) {
				$post_id = $document->get_main_id();
				$used_class_ids = $relations->collect_class_ids_from_post( $post_id, $valid_class_ids );

				if ( ! empty( $used_class_ids ) ) {
					$relations->set_styles_for_post( $post_id, $used_class_ids );
				}
			}
		);
	}

	private function cleanup_kit_meta(): void {
		$kit = Plugin::$instance->kits_manager->get_active_kit();

		if ( ! $kit ) {
			return;
		}

		$kit->delete_meta( Global_Classes_Repository::META_KEY_FRONTEND );
		$kit->delete_meta( Global_Classes_Repository::META_KEY_PREVIEW );
	}
}
