module Devise
  module Strategies
    class IdCardAuthenticatable < Devise::Strategies::Authenticatable
      def valid?
        env['SSL_CLIENT_S_DN_CN'].present?
      end

      def authenticate!
        resource = mapping.to
        user = resource.find_by_id_card(id_card)

        if user
          success!(user)
        else
          fail
        end
      end

      private

      def id_card
        id_card = IdCard.new
        id_card.first_name = first_name
        id_card.last_name = last_name
        id_card.personal_code = personal_code
        id_card.country_code = country_code
        id_card
      end

      def first_name
        env['SSL_CLIENT_S_DN_CN'].split(',').second.force_encoding('utf-8')
      end

      def last_name
        env['SSL_CLIENT_S_DN_CN'].split(',').first.force_encoding('utf-8')
      end

      def personal_code
        env['SSL_CLIENT_S_DN_CN'].split(',').last
      end

      def country_code
        env['SSL_CLIENT_I_DN_C']
      end
    end
  end
end

Warden::Strategies.add(:id_card_authenticatable, Devise::Strategies::IdCardAuthenticatable)