<?php

namespace App\Helpers\FirstParty\OpenAI;

use Exception;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;

class OpenAI
{
    public static function writeArticle($title, $description, $article_type, $min, $max)
    {
        $system_prompt = "
          Using the general article structure, please create a Markdown format article on the topic given. The article should prioritize accuracy and provide genuine value to readers. Avoid making assumptions or adding unverified facts. Ensure the article is between {$min}-{$max} words. Write with 8th & 9th grade US english standard.\n\n
          Structure:\n\n
          Title\n
          Provide a headline that captures the essence of the article's focus and is tailored to the reader's needs.\n\n
          Introduction\n
          Offer a brief overview or background of the topic, ensuring it's engaging and invites readers to continue reading.\n\n
          Main Body\n\n
          Subsection\n
          Introduce foundational information about the topic, ensuring content is accurate and based on known facts. Avoid generic or speculative statements.\n\n
          Subsection (if applicable)\n
          If helpful, use Markdown to create tables to convey comparison of data. Ensure data is accurate and relevant to the reader.\n\n
          Subsection\n
          Dive deep into primary elements or facets of the topic, ensuring content is factual and offers value.\n\n
          Subsection\n
          Discuss real-world applications or significance, highlighting practical implications or actionable insights for the reader.\n\n
          Subsection (optional)\n
          Provide context or relate the topic to relevant past events or trends, making it relatable and more comprehensive.\n\n
          Subsection (if applicable)\n
          Predict outcomes, trends, or ramifications, but ensure predictions are rooted in known information or logical reasoning.\n\n
          Subsection\n
          Summarise key points or lessons, ensuring they resonate with the initial objectives of the article and provide clear takeaways.\n\n
          Conclusion\n
          Revisit main points and offer final thoughts or recommendations that are actionable and beneficial to the reader.\n\n
          FAQs (optional)\n
          Address anticipated questions or misconceptions about the topic. Prioritize questions that readers are most likely to have and provide clear, concise answers based on factual information.\n
          Q: Question\n\n
          A: Answer\n
      ";

        $user_prompt = "Title: {$title}\nDescription: {$description}\nArticleType: {$article_type}";

        return self::chatCompletion($system_prompt, $user_prompt, 'gpt-3.5-turbo', 1200);

    }

    public static function createNewArticleTitle($current_title, $supporting_data)
    {
        $system_prompt = "Based on provided article title, identify the main keyword in 1-2 words. Once identified, use the main keyword only to generate an easy-to-read unique, helpful article title.\n\n
      Requirements:\n
      2 descriptive photos keywords to represent article title when put together side-by-side\n
      No realtime information required\n
      No guides and how tos\n
      No punctuation in titles especially colons :\n
      90-130 characters\n\n

      return in following json format {\"main_keyword\":\"(Main Keyword)\",\"title\":\"(Title in 90-130 letters)\",\"short_title\":\"(Short Title in 30-40 letters)\",\"article_type\":\"(How-tos|Guides|Interview|Review|Commentary|Feature|News|Editorial|Report|Research|Case-study|Overview|Tutorial|Update|Spotlight|Insights)\",\"description\":\"(Summarize in max 120 letters, add cliffhanger is possible to attract readers)\",\"photo_keywords\":[\"photo keyword 1\",\"photo keyword 2\"]}";

        $supporting_data = Str::substr($supporting_data, 0, 2100);

        $user_prompt = "Article Title: {$current_title}\n Article Description: {$supporting_data}\n";

        $reply = self::chatCompletion($system_prompt, $user_prompt, 'gpt-3.5-turbo', 900);

        try {
            return json_decode($reply, false);
        } catch (Exception $e) {
            return null;
        }
    }

    public static function suggestArticleTitles($current_title, $supporting_data, $suggestion_counts)
    {
        $system_prompt = "Based on provided article title, identify the main keyword in 1-2 words. Once identified, use the main keyword only to generate {$suggestion_counts} easy-to-read unique, helpful title articles.\n\n
      Requirements:\n
      2 descriptive photos keywords to represent article title when put together side-by-side\n
      No realtime information required\n
      No guides and how tos\n
      No punctuation in titles especially colons :\n
      90-130 characters\n\n

      return in following json format {\"main_keyword\":\"(Main Keyword)\",\"suggestions\":[{\"title\":\"(Title in 90-130 letters)\",\"short_title\":\"(Short Title in 30-40 letters)\",\"article_type\":\"(How-tos|Guides|Interview|Review|Commentary|Feature|News|Editorial|Report|Research|Case-study|Overview|Tutorial|Update|Spotlight|Insights)\",\"description\":\"(SEO description based on main keyword)\",\"photo_keywords\":[\"photo keyword 1\",\"photo keyword 2\"]}]}";

        $user_prompt = "Article Title: {$current_title}\n Article Description: {$supporting_data}\n";

        $reply = self::chatCompletion($system_prompt, $user_prompt, 'gpt-3.5-turbo');

        try {
            return json_decode($reply, false);
        } catch (Exception $e) {
            return null;
        }

    }

    public static function chatCompletion($system_prompt, $user_prompt, $model, $max_token = 2500)
    {
        try {
            $response = Http::timeout(800)->withToken(config('platform.ai.openai.api_key'))
                ->post('https://api.openai.com/v1/chat/completions', [
                    'model' => $model,
                    'max_tokens' => $max_token,
                    'messages' => [
                        ['role' => 'system', 'content' => $system_prompt],
                        ['role' => 'user', 'content' => $user_prompt],
                    ],
                ]);

            $json_response = json_decode($response->body());

            $reply = $json_response?->choices[0]?->message?->content;

            return $reply;
        } catch (Exception $e) {
            Log::error($response->body());
            inspector()->reportException($e);
            throw ($e);
        }

        return null;

    }
}
