<?php

namespace Pixalia\ImageAssistant\Api;

use Pixalia\ImageAssistant\Base\Const\PixaliaConst;
use Pixalia\ImageAssistant\Repository\OptionRepository;

/**
 * Class PixaliaClient
 * * WordPress標準のHTTP API (wp_remote_*) を使用して
 * Pixalia API と通信を行うクライアントクラス。
 */
class PixaliaClient {

	// 本番環境のエンドポイント
	private const BASE_URL = 'https://pixalia.me/api/v1';
	//private const BASE_URL = 'http://host.docker.internal/api/v1'; // 開発用ローカルサーバー

	private OptionRepository $optionRepository;

	/**
	 * コンストラクタ
	 * @param OptionRepository $optionRepository
	 */
	public function __construct( OptionRepository $optionRepository ) {
		$this->optionRepository = $optionRepository;
	}

	/**
	 * 画像生成タスクを作成 (非同期)
	 * POST /generations
	 */
	public function generate_image( array $params ) {
		$api_key = $this->optionRepository->getApiKey();
		if ( empty( $api_key ) ) {
			return new \WP_Error( 'no_api_key', 'APIキーが設定されていません。' );
		}

		$url = self::BASE_URL . '/generation/store';
		$body = [
			'input' 	  => [
				'title'   => $params['title'] ?? '',
				'content' => $params['content'] ?? '',
			],
			'params'      => [
				'style'        => $params['style'] ?? PixaliaConst::IMAGE_DEFAULT_STYLE,
				'aspect_ratio' => $params['aspect_ratio'] ?? '1',
				'target_type'  => $params['target_type'] ?? 'featured',
			],

		];

		$args = [
			'headers' => [
				'Authorization' => 'Bearer ' . $api_key,
				'Content-Type'  => 'application/json',
				'Accept'        => 'application/json',
			],
			'body'    => wp_json_encode( $body ),
			'timeout' => 30, // 少し長めに
		];

		$response = wp_remote_post( $url, $args );

		return $this->handle_response( $response );
	}

	/**
	 * タスクのステータスを確認
	 * GET /generations/{task_id}
	 */
	public function get_task_status( string $task_id ) {
		$api_key = $this->optionRepository->getApiKey();
		if ( empty( $api_key ) ) {
			return new \WP_Error( 'no_api_key', 'APIキーが設定されていません。' );
		}

		$url = self::BASE_URL . '/generation/show/' . $task_id;

		$args = [
			'headers' => [
				'Authorization' => 'Bearer ' . $api_key,
				'Accept'        => 'application/json',
			],
			'timeout' => 15,
		];

		$response = wp_remote_get( $url, $args );

		return $this->handle_response( $response );
	}

	/**
	 * ユーザーの状態（プラン、クレジット、接続確認）を取得する
	 * * @param string|null $temporary_api_key 保存前のAPIキーでテストする場合に指定
	 * @return array|\WP_Error
	 */
	public function get_user_status( ?string $temporary_api_key = null ) {
		return $this->request( 'GET', '/user/status', [], $temporary_api_key );
	}

	/**
	 * 画像生成リクエストを送信する (非同期ジョブ登録)
	 *
	 * @param string $title 記事タイトル (input.title)
	 * @param string $content 記事本文 (input.content)
	 * @param string $style 画風 (params.style)
	 * @param string $aspect_ratio アスペクト比 (params.aspect_ratio)
	 * @return array|\WP_Error 成功時は { "task_id": "...", "status": "pending" }
	 */
	public function request_generation( string $title, string $content, string $style, string $aspect_ratio ) {
		$body = [
			'input' => [
				'title'   => $title,
				'content' => $content,
			],
			'params' => [
				'style'        => $style,
				'aspect_ratio' => $aspect_ratio,
			],
		];

		return $this->request( 'POST', '/generations', $body );
	}

	/**
	 * タスクの進捗状況を確認する (ポーリング用)
	 *
	 * @param string $task_uuid タスクID
	 * @return array|\WP_Error
	 */
	public function check_task_status( string $task_uuid ) {
		return $this->request( 'GET', '/generations/' . $task_uuid );
	}

	/**
	 * 共通リクエストメソッド
	 * * @param string $method GET or POST
	 * @param string $endpoint エンドポイントパス
	 * @param array $body POSTボディ
	 * @param string|null $api_key_override APIキーの上書き（検証用）
	 * @return array|\WP_Error
	 */
	private function request( string $method, string $endpoint, array $body = [], ?string $api_key_override = null ) {
		// 1. APIキーの決定（引数優先 -> 保存済み -> エラー）
		$api_key = $api_key_override ?? $this->optionRepository->getApiKey();

		if ( empty( $api_key ) ) {
			return new \WP_Error( 'api_key_missing', 'APIキーが設定されていません。' );
		}

		// 2. URL構築
		$url = self::BASE_URL . $endpoint;


		// 3. リクエスト引数設定
		$args = [
			'method'  => $method,
			'headers' => [
				'Authorization' => 'Bearer ' . $api_key,
				'Content-Type'  => 'application/json',
				'Accept'        => 'application/json',
			],
			'timeout' => 30, // タイムアウトは少し長めに
		];

		if ( 'POST' === $method && ! empty( $body ) ) {
			$args['body'] = json_encode( $body );
		}

		// 4. 送信実行 (wp_remote_request)
		$response = wp_remote_request( $url, $args );

		// 5. 通信エラーチェック
		if ( is_wp_error( $response ) ) {
//			error_log( 'Pixalia API Connection Error: ' . $response->get_error_message() );
			return $response;
		}

		// 6. HTTPステータスチェック (WAF等による遮断検知)
		$http_code = wp_remote_retrieve_response_code( $response );
		if ( $http_code !== 200 ) {
			return new \WP_Error( 'http_error', "HTTP Error: {$http_code}", [ 'status' => $http_code ] );
		}

		// 7. JSONパース
		$body_content = wp_remote_retrieve_body( $response );
		$json         = json_decode( $body_content, true );

		if ( ! is_array( $json ) ) {
			return new \WP_Error( 'json_parse_error', 'APIからの応答が無効な形式です。' );
		}

		// 8. アプリケーションエラーチェック (status: error の場合)
		if ( isset( $json['status'] ) && $json['status'] === 'error' ) {
			$error_code = $json['error']['code'] ?? 'unknown_error';
			$message    = $json['error']['message'] ?? 'Pixalia APIエラーが発生しました。';

			// ログに残す
//			error_log( "Pixalia API Error [{$error_code}]: {$message}" );

			return new \WP_Error( $error_code, $message );
		}

		// 9. 成功時は data フィールドのみを返す
		return $json['data'] ?? [];
	}

	/**
	 * レスポンス共通処理
	 */
	private function handle_response( $response ) {
		if ( is_wp_error( $response ) ) {
			return $response;
		}

		$code = wp_remote_retrieve_response_code( $response );
		$body = wp_remote_retrieve_body( $response );
		$data = json_decode( $body, true );

		if ( $code >= 400 ) {
			$message = $data['message'] ?? 'APIエラーが発生しました。';
			return new \WP_Error( 'api_error', $message, [ 'status' => $code ] );
		}

		return $data;
	}
}