# frozen_string_literal: true

require_relative "cdr"

class CDRRepo
	def initialize(db: DB)
		@db = db
	end

	def put(cdr)
		data = cdr.to_h
		data.delete(:rate)
		data.delete(:charge)
		columns, values = data.to_a.transpose
		@db.query_defer(<<~SQL, values)
			INSERT INTO cdr (#{columns.join(',')})
			VALUES ($1, $2, $3, $4, $5, $6, $7)
		SQL
	end

	def find_range(customer, range)
		customer_id = customer.customer_id
		cdrs = @db.query_defer(CDR_SQL, [customer_id, range.first, range.last])

		cdrs.then do |rows|
			rows.map { |row|
				CDR.new(**row.transform_keys(&:to_sym))
			}
		end
	end

	CDR_SQL = <<~SQL
		SELECT
			cdr_id,
			customer_id,
			start,
			billsec,
			disposition,
			tel,
			direction,
			rate,
			charge
		FROM cdr_with_charge
		WHERE customer_id = $1 AND start >= $2 AND DATE_TRUNC('day', start) <= $3
		ORDER BY start DESC
	SQL
end
