module Gaku
  class PersonDecorator < Draper::Decorator
    def sex_and_birth
      [h.gender(object), object.birth_date.to_s].reject(&:empty?).join(', ')
    end

    # returns full name complete with formatting [if any]
    def formatted_name
      student_names
    end

    def formatted_name_reading
      student_names reading: true
    end

    def full_name
      "#{object.surname} #{object.name}"
    end

    def full_name_reading
      student_names without_formating: true, reading: true
    end

    def student_names(options = {})
      @names_preset ||= Gaku::Preset.names
      preset = @names_preset

      if options[:without_formating]
        preset_without_format = ''
        preset.gsub(/%(\w+)/) { |n| preset_without_format << n + ' ' }
        preset = preset_without_format.strip
      end

      if options[:reading] && object.name_reading.blank? &&
         object.surname_reading.blank? &&
         object.middle_name_reading.blank?
        return ''
      end

      reading = options[:reading]
      return reading ? object.phonetic_reading : object.to_s if preset.blank?

      result = preset.gsub(/%(\w+)/) do |name|
        case name
        when '%first' then proper_name(:name, reading)
        when '%middle' then proper_name(:middle_name, reading)
        when '%last' then proper_name(:surname, reading)
        end
      end
      return result.gsub(/[^[[:word:]]\s]/, '').gsub(/\s+/, ' ').strip if object.middle_name.blank?

      result.gsub(/\s+/, ' ').strip
    end

    private

    def proper_name(attribute, reading)
      reading ? object.send(attribute.to_s + '_reading') : object.send(attribute)
    end
  end
end
