module Bio
	class UniProtKB
		 def self.patched?
		 	return true
		 end
		 
		 def ft(feature_key = nil)
		    return ft[feature_key] if feature_key
		    return @data['FT'] if @data['FT']

		    table = []
		    begin
		      get('FT').split("\n").each do |line|
		        if line =~ /^FT   \w/
		          feature = line.chomp.ljust(74)
		          table << [feature[ 5..12].strip,   # Feature Name
		                    feature[14..19].strip,   # From
		                    feature[21..26].strip,   # To
		                    feature[34..74].strip ]  # Description
		        else
		          table.last << line.chomp.sub!(/^FT +/, '')
		        end
		      end

		      # Joining Description lines
		      table = table.map { |feature| 
		        ftid = feature.pop if feature.last =~ /FTId=/
		        if feature.size > 4
		          feature = [feature[0], 
		                     feature[1], 
		                     feature[2], 
		                     feature[3, feature.size - 3].join(" ")]
		        end
		        feature << if ftid then ftid else '' end
		      }
		      
		      ###### PATCH TO RECOVER PARSER
		      to_delete = []
		      table.each_with_index do |feature, i|
		      		name, from, to, descrition = feature
		      		if from.empty?
		      			coors = to.split("..")
		      			if coors.length == 2
		      				feature[1] = coors[0]
		      				feature[2] = coors[1]
		      			elsif /[^\d]/ =~ to
		      				to_delete << i 
		      			else
		      				feature[1] = to
		      				feature[2] = to
		      			end
		      		end
		      end
		      to_delete.reverse_each{|i| table.delete_at(i)}
		      #####

		      hash = {}
		      table.each do |feature|
		        hash[feature[0]] = [] unless hash[feature[0]]
		        hash[feature[0]] << {
		          # Removing '<', '>' or '?' in FROM/TO endopoint.
		          'From' => feature[1].sub(/\D/, '').to_i,  
		          'To'   => feature[2].sub(/\D/, '').to_i, 
		          'Description' => feature[3], 
		          'FTId' => feature[4].to_s.sub(/\/FTId=/, '').sub(/\.$/, ''),
		          'diff' => [],
		          'original' => feature
		        }

		        case feature[0]
		        when 'VARSPLIC', 'VARIANT', 'VAR_SEQ', 'CONFLICT'
		          case hash[feature[0]].last['Description']
		          when /(\w[\w ]*\w*) - ?> (\w[\w ]*\w*)/
		            original_res = $1
		            changed_res = $2
		            original_res = original_res.gsub(/ /,'').strip
		            chenged_res = changed_res.gsub(/ /,'').strip
		          when /Missing/i
		            original_res = seq.subseq(hash[feature[0]].last['From'],
		                                      hash[feature[0]].last['To'])
		            changed_res = ''
		          end
		          hash[feature[0]].last['diff'] = [original_res, chenged_res]
		        end
		      end
		    rescue
		      raise "Invalid FT Lines(#{$!}) in #{entry_id}:, \n'#{self.get('FT')}'\n"
		    end

		    @data['FT'] = hash
		  end
	end
end