# frozen_string_literal: true

module Checkoff
  module Internal
    # Utility methods for working with project dates and times
    class ProjectTiming
      # @param time_class [Class<Time>]
      # @param date_class [Class<Date>]
      # @param client [Asana::Client]
      # @param custom_fields [Checkoff::CustomFields]
      def initialize(time_class: Time, date_class: Date,
                     client: Checkoff::Clients.new.client,
                     custom_fields: Checkoff::CustomFields.new(client: client))
        @time_class = time_class
        @date_class = date_class
        @custom_fields = custom_fields
      end

      # @param project [Asana::Resources::Project]
      # @param field_name [Symbol]
      #
      # @sg-ignore
      # @return [Date, nil]
      def start_date(project)
        return @date_class.parse(project.start_on) unless project.start_on.nil?

        nil
      end

      # @param project [Asana::Resources::Project]
      # @param field_name [Symbol]
      #
      # @sg-ignore
      # @return [Date, nil]
      def due_date(project)
        return @date_class.parse(project.due_on) unless project.due_on.nil?

        nil
      end

      # @param project [Asana::Resources::Project]
      # @param custom_field_name [String]
      #
      # @return [Time, Date, nil]
      def custom_field(project, custom_field_name)
        custom_field = @custom_fields.resource_custom_field_by_name_or_raise(project, custom_field_name)
        # @sg-ignore
        # @type [String, nil]
        time_str = custom_field.fetch('display_value')
        return nil if time_str.nil?

        Time.parse(time_str)
      end

      # @param project [Asana::Resources::Project]
      # @param field_name [Symbol,Array]
      #
      # @sg-ignore
      # @return [Date, Time, nil]
      def date_or_time_field_by_name(project, field_name)
        return due_date(project) if field_name == :due

        return start_date(project) if field_name == :start

        return start_date(project) if field_name == :ready

        if field_name.is_a?(Array)
          # @sg-ignore
          # @type [Symbol]
          actual_field_name = field_name.first
          args = field_name[1..]

          return custom_field(project, *args) if actual_field_name == :custom_field
        end

        raise "Teach me how to handle field #{field_name}"
      end
    end
  end
end