# frozen_string_literal: true

require "flex_station_data/concerns/presenter"
require "flex_station_data/services/sample_quality"
require "flex_station_data/presenters/sample_regression_hash"

module FlexStationData
  module Presenters
    class SampleHash
      include Concerns::Presenter

      attr_reader :times, :sample, :quality_control, :options

      def initialize(times, sample, **options)
        @times = times
        @sample = sample
        @options = options
      end

      def errors
        @errors ||= SampleQuality.call(sample, **options).reject(&:good?)
      end

      def errors?
        errors.present?
      end

      def errors_hash
        { "error" => errors.first&.to_s }
      end

      def wells_hash
        { "wells" => sample.wells.join(", ") }
      end

      def regression_hash
        return SampleRegressionHash.headers.zip([]).to_h if errors?

        SampleRegressionHash.present(times, sample.mean, **options).transform_values(&:first)
      end

      def present
        { "sample" => sample.label }.merge(wells_hash).merge(errors_hash).merge(regression_hash)
      end
    end
  end
end
