module Youtube
  class OauthExchange
    TOKEN_URL = "https://oauth2.googleapis.com/token".freeze

    def self.call(code)
      response = Faraday.post(TOKEN_URL, {
        code: code,
        client_id: ENV["YOUTUBE_CLIENT_ID"],
        client_secret: ENV["YOUTUBE_CLIENT_SECRET"],
        redirect_uri: ENV["YOUTUBE_REDIRECT_URI"],
        grant_type: "authorization_code"
      })
      data = JSON.parse(response.body)
      if data["error"]
        msg = data["error_description"].presence || data["error"]
        if data["error"] == "invalid_grant"
          msg = "Codice OAuth già usato o scaduto. Riapri /admin/youtube/platform e ripeti il collegamento."
        end
        raise BroadcastService::Error, msg
      end

      info = ChannelInfo.fetch(access_token: data["access_token"])
      {
        access_token: data["access_token"],
        refresh_token: data["refresh_token"],
        expires_in: data["expires_in"].to_i,
        channel_id: info[:channel_id],
        channel_title: info[:channel_title]
      }
    end
  end
end
