class AiService
  def initialize
    @client = OpenAI::Client.new(
      access_token: Rails.application.credentials.openai.token,
      uri_base: Rails.application.credentials.openai.uri,
      log_errors: Rails.env.development?,  # 只在开发环境下启用
      request_timeout: 240
    )
  end

  def generate_prompt(city, weather_data)
    city_desc = generate_location_desc(city)

    system_message =
      "You are a professional artist creating prompts for DALL-E 3. Create realistic, artistic weather scenes featuring iconic landmarks."
    user_message = generate_dall_e_3_prompt_request(city, weather_data, city_desc)
    ask_ai(system_message, user_message)
  end

  def generate_location_desc(city)
    region = city.country.region&.name || ""
    country = city.country.name || ""
    state = city.state&.name || ""

    system_message =
      "You are a global geography master, you understand the culture, geography, architecture, customs and other information of all cities around the world. Describe this city based on the city I gave you. Include details about its culture, climate, landmarks, and any unique features that make this place special. Condense the keyword into a description of about 50 words"
    user_message =
      "Describe the characteristics of the city of #{city.name}, located in the #{state}, #{country}, #{region}"
    ask_ai(system_message, user_message)
  end

  def generate_image(prompt)
    response = @client.images.generate(
      parameters: {
        model: "dall-e-3",
        prompt: prompt,
        size: "1792x1024",
        # quality: "standard",
        quality: "hd",
        n: 1
      }
    )

    response.dig("data", 0, "url")
  end

  private

  def ask_ai(system_message, user_message)
    response = @client.chat(
      parameters: {
        model: "gpt-4o",
        messages:
          [ {
              role: "System",
              content: system_message
            }, {
              role: "User",
              content: user_message
            } ],
        temperature: 0.7,
        max_tokens: 300
      }
    )
    response.dig("choices", 0, "message", "content")
  end

  def generate_dall_e_3_prompt_request(city, weather_data, city_desc)
    region = city.country.region&.name || ""
    country = city.country.name || ""
    state = city.state&.name || ""

    <<~PROMPT
      Create a DALL-E 3 prompt for a weather scene in #{city.name}, #{state}, #{country}, #{region}.

      Location Desc: #{city_desc}

      Weather conditions:
      - Temperature: #{weather_data[:temperature]}°C
      - Weather: #{weather_data[:description]}
      - Cloud cover: #{weather_data[:cloud]}%
      - Time: #{weather_data[:time]}

      Requirements:
      - Feature iconic landmarks or architecture from #{city.name}
      - Realistic style
      - Weather conditions should be clearly visible
      - Keep the picture clear and bright and avoid blurring
      - Ensure the overall brightness is maintained, even in overcast conditions, by incorporating vibrant colors and soft lighting effects.
      - If it’s a sunny day, enhance the brightness and warmth of the scene.
      - Atmospheric and artistic composition

      Generate a detailed, creative prompt that will produce a beautiful and realistic image. Directly output prompt words, no prefix and suffix words
    PROMPT
  end
end