// 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 PRINTING_BACKEND_PRINT_BACKEND_TEST_CONSTANTS_H_
#define PRINTING_BACKEND_PRINT_BACKEND_TEST_CONSTANTS_H_

#include <stdint.h>

#include <vector>

#include "build/build_config.h"
#include "printing/backend/mojom/print_backend.mojom-forward.h"
#include "printing/backend/print_backend.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/gfx/geometry/size.h"

namespace printing {

// Sample capabilities used to set optional fields in
// GenerateSamplePrinterSemanticCapsAndDefaults().
struct OptionalSampleCapabilities {
  OptionalSampleCapabilities();
  OptionalSampleCapabilities(const OptionalSampleCapabilities&) = delete;
  OptionalSampleCapabilities& operator=(const OptionalSampleCapabilities&) =
      delete;
  OptionalSampleCapabilities(OptionalSampleCapabilities&& other) noexcept;
  OptionalSampleCapabilities& operator=(
      OptionalSampleCapabilities&& other) noexcept;
  ~OptionalSampleCapabilities();

#if BUILDFLAG(IS_CHROMEOS)
  bool pin_supported = false;
  AdvancedCapabilities advanced_capabilities;
#endif  // BUILDFLAG(IS_CHROMEOS)
#if BUILDFLAG(IS_WIN)
  absl::optional<PageOutputQuality> page_output_quality;
#endif  // BUILDFLAG(IS_WIN)
};

inline const PrinterSemanticCapsAndDefaults::Paper kPaperA3{
    /*display_name=*/"A3", /*vendor_id=*/"67",
    /*size_um=*/gfx::Size(7016, 9921),
    /*printable_area_um=*/gfx::Rect(0, 0, 7016, 9921)};
inline const PrinterSemanticCapsAndDefaults::Paper kPaperA4{
    /*display_name=*/"A4",
    /*vendor_id=*/"12",
    /*size_um=*/gfx::Size(4961, 7016),
    /*printable_area_um=*/gfx::Rect(100, 200, 500, 800),
    /*max_height_um=*/0,
    /*has_borderless_variant=*/true};
inline const PrinterSemanticCapsAndDefaults::Paper kPaperLetter{
    /*display_name=*/"Letter", /*vendor_id=*/"45",
    /*size_um=*/gfx::Size(5100, 6600),
    /*printable_area_um=*/gfx::Rect(0, 0, 5100, 6600)};
inline const PrinterSemanticCapsAndDefaults::Paper kPaperLedger{
    /*display_name=*/"Ledger", /*vendor_id=*/"89",
    /*size_um=*/gfx::Size(6600, 10200),
    /*printable_area_um=*/gfx::Rect(0, 0, 6600, 10200)};
inline const PrinterSemanticCapsAndDefaults::Paper kPaperCustom{
    /*display_name=*/"Custom",
    /*vendor_id=*/"",
    /*size_um=*/gfx::Size(2540, 5080),
    /*printable_area_um=*/gfx::Rect(0, 0, 2540, 5080),
    /*max_height_um=*/20000};

inline const PrinterSemanticCapsAndDefaults::MediaType kMediaTypePlain{
    /*display_name=*/"Plain Paper",
    /*vendor_id=*/"stationery",
};
inline const PrinterSemanticCapsAndDefaults::MediaType kMediaTypePhoto{
    /*display_name=*/"Photo Paper",
    /*vendor_id=*/"photographic",
};

#if BUILDFLAG(IS_CHROMEOS)
inline const AdvancedCapability kAdvancedCapability1(
    /*name=*/"advanced_cap_bool",
    /*display_name=*/"Advanced Capability #1 (bool)",
    /*type=*/AdvancedCapability::Type::kBoolean,
    /*default_value=*/"true",
    /*values=*/{});
inline const AdvancedCapability kAdvancedCapability2(
    /*name=*/"advanced_cap_double",
    /*display_name=*/"Advanced Capability #2 (double)",
    /*type=*/AdvancedCapability::Type::kFloat,
    /*default_value=*/"3.14159",
    /*values=*/
    {
        AdvancedCapabilityValue(
            /*name=*/"adv_cap_val_1",
            /*display_name=*/"Advanced Capability #1"),
        AdvancedCapabilityValue(
            /*name=*/"adv_cap_val_2",
            /*display_name=*/"Advanced Capability #2"),
        AdvancedCapabilityValue(
            /*name=*/"adv_cap_val_3",
            /*display_name=*/"Advanced Capability #3"),
    });
inline const AdvancedCapabilities kAdvancedCapabilities{kAdvancedCapability1,
                                                        kAdvancedCapability2};
#endif  // BUILDFLAG(IS_CHROMEOS)

#if BUILDFLAG(IS_WIN)
inline const PageOutputQualityAttribute kPageOutputQualityAttribute1(
    /*display_name=*/"Normal",
    /*name=*/"ns000:Normal");
inline const PageOutputQualityAttribute kPageOutputQualityAttribute2(
    /*display_name=*/"Draft",
    /*name=*/"ns000:Draft");
inline const PageOutputQualityAttribute kPageOutputQualityAttribute3(
    /*display_name=*/"Advance",
    /*name=*/"ns000:Advance");
inline const PageOutputQualityAttributes kPageOutputQualityAttributes{
    kPageOutputQualityAttribute1, kPageOutputQualityAttribute2,
    kPageOutputQualityAttribute3};
inline const PageOutputQuality kPageOutputQuality(
    kPageOutputQualityAttributes,
    /*default_quality=*/absl::nullopt);
inline constexpr char kDefaultQuality[] = "ns000:Draft";
#endif  // BUILDFLAG(IS_WIN)

inline constexpr bool kCollateCapable = true;
inline constexpr bool kCollateDefault = true;
inline constexpr int32_t kCopiesMax = 123;
inline const std::vector<mojom::DuplexMode> kDuplexModes{
    mojom::DuplexMode::kSimplex, mojom::DuplexMode::kLongEdge,
    mojom::DuplexMode::kShortEdge};
inline constexpr mojom::DuplexMode kDuplexDefault = mojom::DuplexMode::kSimplex;
inline constexpr bool kColorChangeable = true;
inline constexpr bool kColorDefault = true;
inline constexpr mojom::ColorModel kColorModel = mojom::ColorModel::kRGB;
inline constexpr mojom::ColorModel kBwModel = mojom::ColorModel::kGrayscale;
inline const PrinterSemanticCapsAndDefaults::Papers kPapers{kPaperA4,
                                                            kPaperLetter};
inline const PrinterSemanticCapsAndDefaults::Papers kUserDefinedPapers{
    kPaperA3, kPaperLedger, kPaperCustom};
inline const PrinterSemanticCapsAndDefaults::Paper kDefaultPaper = kPaperLetter;
inline constexpr gfx::Size kDpi600(600, 600);
inline constexpr gfx::Size kDpi1200(1200, 1200);
inline constexpr gfx::Size kDpi1200x600(1200, 600);
inline const std::vector<gfx::Size> kDpis{kDpi600, kDpi1200, kDpi1200x600};
inline constexpr gfx::Size kDefaultDpi = kDpi600;
inline const PrinterSemanticCapsAndDefaults::MediaTypes kMediaTypes{
    kMediaTypePlain, kMediaTypePhoto};
inline const PrinterSemanticCapsAndDefaults::MediaType kDefaultMediaType =
    kMediaTypePlain;
#if BUILDFLAG(IS_CHROMEOS)
inline constexpr bool kPinSupported = true;
#endif

#if BUILDFLAG(IS_CHROMEOS)
OptionalSampleCapabilities SampleWithPinAndAdvancedCapabilities();
#endif  // BUILDFLAG(IS_CHROMEOS)

#if BUILDFLAG(IS_WIN)
OptionalSampleCapabilities SampleWithPageOutputQuality();
#endif  // BUILDFLAG(IS_WIN)

PrinterSemanticCapsAndDefaults GenerateSamplePrinterSemanticCapsAndDefaults(
    OptionalSampleCapabilities sample_capabilities);

}  // namespace printing

#endif  // PRINTING_BACKEND_PRINT_BACKEND_TEST_CONSTANTS_H_
