// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef ASH_WALLPAPER_ONLINE_WALLPAPER_VARIANT_INFO_FETCHER_H_
#define ASH_WALLPAPER_ONLINE_WALLPAPER_VARIANT_INFO_FETCHER_H_

#include <memory>
#include <string>
#include <vector>

#include "ash/ash_export.h"
#include "ash/public/cpp/wallpaper/online_wallpaper_params.h"
#include "ash/public/cpp/wallpaper/wallpaper_info.h"
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "components/account_id/account_id.h"

namespace backdrop {
class Image;
}

namespace ash {

class WallpaperControllerClient;

// Resolves wallpaper variants for WallpaperController. These variants can exist
// from WallpaperInfo or can be fetched from the backdrop server.
class ASH_EXPORT OnlineWallpaperVariantInfoFetcher {
 public:
  OnlineWallpaperVariantInfoFetcher();

  OnlineWallpaperVariantInfoFetcher(const OnlineWallpaperVariantInfoFetcher&) =
      delete;
  OnlineWallpaperVariantInfoFetcher& operator=(
      const OnlineWallpaperVariantInfoFetcher&) = delete;

  ~OnlineWallpaperVariantInfoFetcher();

  void SetClient(WallpaperControllerClient* client);

  // Callback for Fetch* methods which populates the |unit_id| and |variants|
  // fields in OnlineWallpaperParams.
  using FetchParamsCallback =
      base::OnceCallback<void(std::optional<OnlineWallpaperParams>)>;

  // Fetches the wallpaper variants for |info| to produce a fully populated
  // OnlineWallpaperParams in |callback|.
  void FetchOnlineWallpaper(const AccountId& account_id,
                            const WallpaperInfo& info,
                            FetchParamsCallback callback);

  // Always fetches a new daily refresh wallpaper and calls |callback| with a
  // fully populated OnlineWallpaperParams.
  bool FetchDailyWallpaper(const AccountId& account_id,
                           const WallpaperInfo& info,
                           FetchParamsCallback callback);

  // Fetches the time of day wallpaper that has `unit_id` for the user with
  // `account_id`. Callback is run after the operation completes.
  void FetchTimeOfDayWallpaper(const AccountId& account_id,
                               uint64_t unit_id,
                               FetchParamsCallback callback);

 private:
  // An internal representation of the partial information required to construct
  // a complete OnlineWallpaperParams object as provided by the caller of
  // Fetch*.
  struct OnlineWallpaperRequest {
   public:
    OnlineWallpaperRequest(const AccountId& account_id,
                           const std::string& collection_id,
                           WallpaperLayout layout,
                           bool daily_refresh_enabled);
    OnlineWallpaperRequest(const OnlineWallpaperRequest&) = delete;
    OnlineWallpaperRequest& operator=(const OnlineWallpaperRequest&) = delete;
    ~OnlineWallpaperRequest();

    AccountId account_id;
    std::string collection_id;
    WallpaperLayout layout;
    bool daily_refresh_enabled;
  };

  // Handles the response for a single random image in a collection and proceeds
  // to fetch the rest of the collection.
  void OnSingleFetch(std::unique_ptr<OnlineWallpaperRequest> request,
                     FetchParamsCallback callback,
                     bool success,
                     const backdrop::Image& image);

  // Finishes variants fetch by populating the remaining fields for
  // OnlineWallpaperParams in |callback|. Combines data from |request| with
  // |images| and the matching variant in |images| for |location|.
  void FindAndSetOnlineWallpaperVariants(
      std::unique_ptr<OnlineWallpaperRequest> request,
      const std::string& location,
      FetchParamsCallback callback,
      bool success,
      const std::vector<backdrop::Image>& images);

  // Used as callback when the time of day wallpapers are fetched.
  void OnTimeOfDayWallpapersFetched(
      std::unique_ptr<OnlineWallpaperRequest> request,
      uint64_t unit_id,
      FetchParamsCallback callback,
      bool success,
      const std::vector<backdrop::Image>& images);

  raw_ptr<WallpaperControllerClient> wallpaper_controller_client_ =
      nullptr;  // not owned

  base::WeakPtrFactory<OnlineWallpaperVariantInfoFetcher> weak_factory_{this};
};

}  // namespace ash

#endif  //  ASH_WALLPAPER_ONLINE_WALLPAPER_VARIANT_INFO_FETCHER_H_
