<?php
/**
 * UTTeam App
 *
 * @category   WordPress_Plugin
 * @package    Common
 * @subpackage Suppliers
 * @author     miniOrange <info@miniorange.com>
 * @license    MIT/Expat
 * @link       https://plugins.miniorange.com/woocommerce-api-product-sync-with-woocommerce-rest-apis
 */

namespace MOWCPS\Common\Suppliers;

use WP_Error;
use MOWCPS\Common\Abstracts\Base_Supplier_App;
use MOWCPS\Common\Interfaces\Supplier_App_Interface;
use MOWCPS\Common\Constants\Constants;
use MOWCPS\Common\Services\API\API_Service;
use MOWCPS\Common\Services\Authorization\Authorization_Service;
use MOWCPS\Common\Utils\Utils;

if ( ! defined( 'ABSPATH' ) ) {
	die;
}

/**
 * Class Utteam
 *
 * Handles UTTeam supplier app operations
 */
class Utteam extends Base_Supplier_App implements Supplier_App_Interface {
	/**
	 * Constructor
	 */
	public function __construct() {
		parent::__construct( Constants::SUPPLIER_APP_TYPE_UTTEAM );
	}

	/**
	 * Perform UTTeam-specific connection test
	 *
	 * @param array $supplier_data Supplier data.
	 * @return array Test result.
	 */
	public function perform_connection_test( $supplier_data ) {
		// Validate supplier-specific configuration using existing validation method.
		$validation_result = $this->validate_supplier_specific_configuration( $supplier_data );
		if ( is_wp_error( $validation_result ) ) {
			return $this->get_test_result(
				false,
				sprintf( Constants::SUPPLIER_AUTH_FAILED, $this->supplier_name, $validation_result->get_error_message() ),
			);
		}

		// Load and process configuration with dynamic parameters.
		$processed_config = $this->load_and_process_configuration( $supplier_data );
		if ( is_wp_error( $processed_config ) ) {
			return $this->get_test_result(
				false,
				sprintf( Constants::SUPPLIER_CONFIG_LOADING_FAILED, $this->supplier_name, $processed_config->get_error_message() ),
			);
		}

		// Get authorization configuration.
		$authorization = $processed_config[ Constants::AUTHORIZATION ] ?? array();

		$auth_service = new Authorization_Service();
		$headers      = $auth_service->generate_headers( $authorization, 0 );

		if ( is_wp_error( $headers ) ) {
			return $this->get_test_result(
				false,
				sprintf( Constants::SUPPLIER_AUTH_FAILED, $this->supplier_name, $headers->get_error_message() ),
			);
		}

		// Test with the highest priority connection (0 or 1).
		$connections     = $processed_config['connections'] ?? array();
		$test_connection = $this->find_test_connection( $connections );

		if ( empty( $test_connection ) ) {
			return $this->get_test_result(
				false,
				sprintf( Constants::SUPPLIER_NO_TEST_ENDPOINT, $this->supplier_name ),
			);
		}

		$config      = $test_connection['configuration'];
		$endpoint    = $config['endpoint'];
		$method      = $config['method'];
		$headers     = array_merge( $headers, $config['headers'] ?? array() );
		$body_config = $config['body'];

		if ( empty( $endpoint ) ) {
			return $this->get_test_result(
				false,
				sprintf( Constants::SUPPLIER_NO_TEST_ENDPOINT_AVAILABLE, $this->supplier_name ),
			);
		}

		// Extract body data based on body type.
		$body_type = $body_config['type'] ?? '';
		$body_data = $body_config['data'] ?? array();

		// Try with Anvil brand first, fallback to Gildan if that fails.
		$brands_to_test = array( 'Anvil', 'Gildan' );

		foreach ( $brands_to_test as $brand ) {
			// Add variables for UTTeam test configuration.
			if ( is_array( $body_data ) ) {
				$body_data['variables'] = 'brand:' . $brand . ';';
			}

			$body = is_array( $body_data ) ? wp_json_encode( $body_data ) : $body_data;

			// Prepare API request.
			$api_request = array(
				'endpoint' => $endpoint,
				'method'   => $method,
				'headers'  => $headers,
				'body'     => $body,
				'timeout'  => 60,
			);

			// Make the authentication request.
			$response = API_Service::make_api_call( $api_request['endpoint'], $api_request );

			$response_code    = wp_remote_retrieve_response_code( $response );
			$response_message = wp_remote_retrieve_response_message( $response );
			$response_body    = json_decode( wp_remote_retrieve_body( $response ), true );

			if ( is_wp_error( $response ) ) {
				continue; // Try next brand.
			}

			if ( ! Utils::is_status_success( $response ) ) {
				continue; // Try next brand.
			}

			// Success - return immediately.
			return $this->get_test_result(
				true,
				sprintf( Constants::SUPPLIER_AUTH_SUCCESSFUL, $this->supplier_name ),
				$response_code,
				$response_body,
			);
		}

		// Both brands failed.
		return $this->get_test_result(
			false,
			sprintf( Constants::SUPPLIER_AUTH_FAILED, $this->supplier_name, $response_message ?? 'Connection failed' ),
			$response_code ?? null,
			$response_body ?? null,
		);
	}

	/**
	 * Validate UTTeam-specific configuration
	 *
	 * @param array $supplier_data Supplier data to validate.
	 * @return bool|WP_Error True if valid, WP_Error if invalid.
	 */
	public function validate_supplier_specific_configuration( $supplier_data ) {
		// Validate required fields for UTTeam.
		if ( empty( $supplier_data['api_key'] ) ) {
			return new WP_Error(
				Constants::ERROR_INVALID_SUPPLIER_CONFIG,
				sprintf( Constants::SUPPLIER_MISSING_API_KEY, $this->supplier_name ),
				array( 'status' => Constants::HTTP_BAD_REQUEST )
			);
		}

		return true;
	}
}
