Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 122
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
LogoGenerationService
0.00% covered (danger)
0.00%
0 / 122
0.00% covered (danger)
0.00%
0 / 6
600
0.00% covered (danger)
0.00%
0 / 1
 generate
0.00% covered (danger)
0.00%
0 / 26
0.00% covered (danger)
0.00%
0 / 1
20
 generate_more
0.00% covered (danger)
0.00%
0 / 19
0.00% covered (danger)
0.00%
0 / 1
12
 generation_status
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 1
20
 select
0.00% covered (danger)
0.00%
0 / 28
0.00% covered (danger)
0.00%
0 / 1
20
 get_logos
0.00% covered (danger)
0.00%
0 / 27
0.00% covered (danger)
0.00%
0 / 1
72
 is_locale_supported
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace NewfoldLabs\WP\Module\Onboarding\Services\Ai\ImageGeneration;
4
5use NewfoldLabs\WP\Module\Onboarding\Services\MediaService;
6use NewfoldLabs\WP\Module\Onboarding\Types\Logo;
7
8/**
9 * Logo Generation Service
10 *
11 * This service is used to generate logos for a site.
12 * Service API Documentation: https://github.com/newfold-labs/cloud-patterns/wiki/LogoGen-Service#api
13 */
14class LogoGenerationService {
15
16    /**
17     * The logos.
18     *
19     * @var array
20     */
21    private $logos = array();
22
23    /**
24     * Generate logos.
25     *
26     * @param string $site_title The site title.
27     * @param string $site_description The site description.
28     * @param string $locale The locale.
29     * @return string|WP_Error The tracking reference ID or a WP_Error object if the request fails.
30     */
31    public function generate( string $site_title, string $site_description, string $locale ) {
32        if ( ! self::is_locale_supported( $locale ) ) {
33            return new \WP_Error(
34                'logogen_locale_not_supported',
35                'Locale not supported',
36                array( 'status' => 400 )
37            );
38        }
39
40        $request = new ImageGenerationServiceRequest(
41            'logos/generate',
42            array(
43                'name' => $site_title,
44                'description' => $site_description
45            )
46        );
47        $request->send();
48
49        // Success.
50        if (
51            $request->is_successful() &&
52            isset( $request->get_response_body()['reference_id'] )
53        ) {
54            $reference_id = $request->get_response_body()['reference_id'];
55            return array( 'reference_id' => $reference_id );
56        }
57
58        // Error.
59        $response_code = $request->get_response_code();
60        $error_message = $request->get_error_message();
61        $response = new \WP_Error(
62            'logogen_generation_failed',
63            $error_message,
64            array( 'status' => $response_code )
65        );
66
67        return $response;
68    }
69
70    /**
71     * Generate more logos.
72     *
73     * @param string $reference_id The reference ID.
74     * @return string|WP_Error The status or a WP_Error object if the request fails.
75     */
76    public function generate_more( string $reference_id ) {
77        $request = new ImageGenerationServiceRequest(
78            'logos/generate/more',
79            array(
80                'reference_id' => $reference_id
81            )
82        );
83        $request->send();
84
85        // Success.
86        if (
87            $request->is_successful() &&
88            isset( $request->get_response_body()['status'] )
89        ) {
90            $status = $request->get_response_body()['status'];
91            return array( 'status' => $status );
92        }
93
94        // Error.
95        $response_code = $request->get_response_code();
96        $error_message = $request->get_error_message();
97        $response = new \WP_Error(
98            'logogen_generation_more_failed',
99            $error_message,
100            array( 'status' => $response_code )
101        );
102
103        return $response;
104    }
105
106    /**
107     * Get the generation status.
108     *
109     * @param string $reference_id The reference ID.
110     * @return array|WP_Error The generation status or a WP_Error object if the request fails.
111     */
112    public function generation_status( string $reference_id ) {
113        $request = new ImageGenerationServiceRequest(
114            'logos/generate/status',
115            array(
116                'reference_id' => $reference_id
117            )
118        );
119        $request->send();
120
121        // Success.
122        if (
123            $request->is_successful() &&
124            isset( $request->get_response_body()['status'] )
125        ) {
126            $status = $request->get_response_body()['status'];
127            // Store the logos if the generation is completed.
128            if ( $status === 'completed' ) {
129                $this->logos = $request->get_response_body()['logos'];
130            }
131            return array( 'status' => $status );
132        }
133
134        // Error.
135        $response_code = $request->get_response_code();
136        $error_message = $request->get_error_message();
137        $response = new \WP_Error(
138            'logogen_generation_status_check_failed',
139            $error_message,
140            array( 'status' => $response_code )
141        );
142
143        return $response;
144    }
145
146    /**
147     * Select a logo.
148     *
149     * @param string $logo_reference_id The logo reference ID.
150     * @return array|WP_Error The selected logo URL or a WP_Error object if the request fails.
151     */
152    public function select( string $logo_reference_id ) {
153        $request = new ImageGenerationServiceRequest(
154            'logos/generate/select',
155            array(
156                'logo_reference_id' => $logo_reference_id
157            )
158        );
159        $request->send();
160
161        // Success.
162        if (
163            $request->is_successful() &&
164            isset( $request->get_response_body()['selected_logo_url'] )
165        ) {
166            $selected_logo_url = $request->get_response_body()['selected_logo_url'];
167            $attachment_data = MediaService::import_image_from_url( $selected_logo_url );
168            if ( is_array( $attachment_data ) ) {
169                $id = $attachment_data['id'];
170                $url = $attachment_data['src'];
171                return array( 'selected_logo_id' => $id, 'selected_logo_url' => $url );
172            } else {
173                return new \WP_Error(
174                    'logogen_select_logo_import_failed',
175                    'Failed to import logo image',
176                    array( 'status' => 500 )
177                );
178            }
179        }
180
181        // Error.
182        $response_code = $request->get_response_code();
183        $error_message = $request->get_error_message();
184        $response = new \WP_Error(
185            'logogen_select_logo_failed',
186            $error_message,
187            array( 'status' => $response_code )
188        );
189
190        return $response;
191    }
192
193    /**
194     * Get the logos.
195     *
196     * @param bool $as_array Whether to return the logos as array of arrays instead of Logo objects.
197     * @param bool $shuffle Whether to shuffle the logos.
198     * @return array|WP_Error The logos as array of Logo objects or a WP_Error object if the response is malformed.
199     */
200    public function get_logos( bool $as_array = false, bool $shuffle = false ) {
201        $logos = array();
202        foreach ( $this->logos as $logo ) {
203            $reference_id = $logo['reference_id'] ?? null;
204            $style = $logo['style'] ?? null;
205            $url = $logo['url'] ?? null;
206
207            // Ensure shape is not malformed.
208            if ( ! $reference_id || ! $style || ! $url ) {
209                continue;
210            }
211
212            if ( $as_array ) {
213                $logos[] = array(
214                    'reference_id' => $reference_id,
215                    'style' => $style,
216                    'url' => $url
217                );
218            } else {
219                $logos[] = new Logo(
220                    $reference_id,
221                    $style,
222                    $url
223                );
224            }
225        }
226
227        // Ensure the response is not malformed.
228        if ( empty( $logos ) ) {
229            return new \WP_Error(
230                'logogen_logos_response_malformed',
231                'Malformed logos response',
232                array( 'status' => 404 )
233            );
234        }
235
236        if ( $shuffle ) {
237            shuffle( $logos );
238        }
239
240        return $logos;
241    }
242
243    /**
244     * Check if the locale is supported.
245     *
246     * @param string $locale The locale to check.
247     * @return bool True if the locale is supported, false otherwise.
248     */
249    public static function is_locale_supported( string $locale ): bool {
250        return strpos( $locale, 'en_' ) === 0;
251    }
252}