/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

#pragma once

/// \file iceberg/transform_function.h

#include "iceberg/transform.h"

namespace iceberg {
/// \brief Identity transform that returns the input unchanged.
class ICEBERG_EXPORT IdentityTransform : public TransformFunction {
 public:
  /// \param source_type Type of the input data.
  explicit IdentityTransform(std::shared_ptr<Type> const& source_type);

  /// \brief Returns the same Literal as the input.
  Result<Literal> Transform(const Literal& literal) override;

  /// \brief Returns the same type as source_type.
  std::shared_ptr<Type> ResultType() const override;

  /// \brief Create an IdentityTransform.
  /// \param source_type Type of the input data.
  /// \return A Result containing the IdentityTransform or an error.
  static Result<std::unique_ptr<TransformFunction>> Make(
      std::shared_ptr<Type> const& source_type);
};

/// \brief Bucket transform that hashes input values into N buckets.
class ICEBERG_EXPORT BucketTransform : public TransformFunction {
 public:
  /// \param source_type Type of the input data.
  /// \param num_buckets Number of buckets to hash into.
  BucketTransform(std::shared_ptr<Type> const& source_type, int32_t num_buckets);

  /// \brief Applies the bucket hash function to the input Literal.
  ///
  /// Reference:
  /// - https://iceberg.apache.org/spec/#appendix-b-32-bit-hash-requirements
  Result<Literal> Transform(const Literal& literal) override;

  /// \brief Returns INT32 as the output type.
  std::shared_ptr<Type> ResultType() const override;

  /// \brief Returns the number of buckets.
  int32_t num_buckets() const { return num_buckets_; }

  /// \brief Create a BucketTransform.
  /// \param source_type Type of the input data.
  /// \param num_buckets Number of buckets to hash into.
  /// \return A Result containing the BucketTransform or an error.
  static Result<std::unique_ptr<TransformFunction>> Make(
      std::shared_ptr<Type> const& source_type, int32_t num_buckets);

 private:
  [[nodiscard]] bool Equals(const TransformFunction& other) const override;

  int32_t num_buckets_;
};

/// \brief Truncate transform that truncates values to a specified width.
class ICEBERG_EXPORT TruncateTransform : public TransformFunction {
 public:
  /// \param source_type Type of the input data.
  /// \param width The width to truncate to (e.g., for strings or numbers).
  TruncateTransform(std::shared_ptr<Type> const& source_type, int32_t width);

  /// \brief Truncates the input Literal to the specified width.
  Result<Literal> Transform(const Literal& literal) override;

  /// \brief Returns the same type as source_type.
  std::shared_ptr<Type> ResultType() const override;

  /// \brief Returns the width to truncate to.
  int32_t width() const { return width_; }

  /// \brief Create a TruncateTransform.
  /// \param source_type Type of the input data.
  /// \param width The width to truncate to.
  /// \return A Result containing the TruncateTransform or an error.
  static Result<std::unique_ptr<TransformFunction>> Make(
      std::shared_ptr<Type> const& source_type, int32_t width);

 private:
  [[nodiscard]] bool Equals(const TransformFunction& other) const override;

  int32_t width_;
};

/// \brief Year transform that extracts the number of years from timestamp inputs since
/// the epoch.
class ICEBERG_EXPORT YearTransform : public TransformFunction {
 public:
  /// \param source_type Must be a timestamp type.
  explicit YearTransform(std::shared_ptr<Type> const& source_type);

  /// \brief Extract a date or timestamp year, as years from 1970.
  Result<Literal> Transform(const Literal& literal) override;

  /// \brief Returns INT32 as the output type.
  std::shared_ptr<Type> ResultType() const override;

  /// \brief Create a YearTransform.
  /// \param source_type Type of the input data.
  /// \return A Result containing the YearTransform or an error.
  static Result<std::unique_ptr<TransformFunction>> Make(
      std::shared_ptr<Type> const& source_type);
};

/// \brief Month transform that extracts the number of months from timestamp inputs since
/// the epoch.
class ICEBERG_EXPORT MonthTransform : public TransformFunction {
 public:
  /// \param source_type Must be a timestamp type.
  explicit MonthTransform(std::shared_ptr<Type> const& source_type);

  /// \brief Extract a date or timestamp month, as months from 1970-01-01.
  Result<Literal> Transform(const Literal& literal) override;

  /// \brief Returns INT32 as the output type.
  std::shared_ptr<Type> ResultType() const override;

  /// \brief Create a MonthTransform.
  /// \param source_type Type of the input data.
  /// \return A Result containing the MonthTransform or an error.
  static Result<std::unique_ptr<TransformFunction>> Make(
      std::shared_ptr<Type> const& source_type);
};

/// \brief Day transform that extracts the number of days from timestamp inputs since the
/// epoch.
class ICEBERG_EXPORT DayTransform : public TransformFunction {
 public:
  /// \param source_type Must be a timestamp type.
  explicit DayTransform(std::shared_ptr<Type> const& source_type);

  /// \brief Extract a date or timestamp day, as days from 1970-01-01.
  Result<Literal> Transform(const Literal& literal) override;

  /// \brief Return the result type of a day transform.
  ///
  /// Note: The physical representation conforms to the Iceberg spec as DateType is
  /// internally converted to int. The DateType returned here provides a more
  /// human-readable way to display the partition field.
  std::shared_ptr<Type> ResultType() const override;

  /// \brief Create a DayTransform.
  /// \param source_type Type of the input data.
  /// \return A Result containing the DayTransform or an error.
  static Result<std::unique_ptr<TransformFunction>> Make(
      std::shared_ptr<Type> const& source_type);
};

/// \brief Hour transform that extracts the number of hours from timestamp inputs since
/// the epoch.
class ICEBERG_EXPORT HourTransform : public TransformFunction {
 public:
  /// \param source_type Must be a timestamp type.
  explicit HourTransform(std::shared_ptr<Type> const& source_type);

  /// \brief Extract a timestamp hour, as hours from 1970-01-01 00:00:00.
  Result<Literal> Transform(const Literal& literal) override;

  /// \brief Returns INT32 as the output type.
  std::shared_ptr<Type> ResultType() const override;

  /// \brief Create a HourTransform.
  /// \param source_type Type of the input data.
  /// \return A Result containing the HourTransform or an error.
  static Result<std::unique_ptr<TransformFunction>> Make(
      std::shared_ptr<Type> const& source_type);
};

/// \brief Void transform that discards the input and always returns null.
class ICEBERG_EXPORT VoidTransform : public TransformFunction {
 public:
  /// \param source_type Input type (ignored).
  explicit VoidTransform(std::shared_ptr<Type> const& source_type);

  /// \brief Returns a null literal.
  Result<Literal> Transform(const Literal& literal) override;

  /// \brief Returns the same type as source_type.
  std::shared_ptr<Type> ResultType() const override;

  /// \brief Create a VoidTransform.
  /// \param source_type Input type (ignored).
  /// \return A Result containing the VoidTransform or an error.
  static Result<std::unique_ptr<TransformFunction>> Make(
      std::shared_ptr<Type> const& source_type);
};

}  // namespace iceberg
