# -*- coding: utf-8 -*-
class TrackerSoap
  require 'savon'
  attr_reader :client

## Для списковых полей и полей типа sql-список (там где в поле кладется Id, а отображается в трекере связанная с ним информация, например ник или пункт списка) new_value_id
## Для полей всех остальных(строка, текст) new_value

  def initialize
#      element_form_default :qualified
#      env_namespace :soapenv
#      soap_version '1'
#     strip_namespaces false
#     element_form_default :qualified
#     log_level :debug
#     pretty_print_xml :true

    @client = Savon.client do
      wsdl  "https://tracker.rinet.ru/soap_frontend.php?wsdl"
      raise_errors false
      use_ssl = true
      convert_request_keys_to :none
      encoding "ISO-8859-1"
    end
  end


  def self.make_xml
    builder = Builder::XmlMarkup.new
    builder.instruct!(:xml, :encoding => "UTF-8")
     builder.fields_data { |b|
      b.field_tag("opisanie")
      b.is_sys_field(false)
      b.new_value("1")
    }
    builder
  end

 


  def get_user_id(nic)
    begin
      response = self.client.call(:csoap_find_user_by_nick, :message => {:user_nick => nic}) 
      if response
        id = response.to_hash[:csoap_find_user_by_nick_response][:return]
      end
    rescue Exception => e
      ActiveRecord::Base.logger.warn "TRACKER SOAP ERROR get_user_id #{nic}"
      id = nil
    end
  end


  def self.update(report)  
    if RAILS_ENV != 'development'
    soap = TrackerSoap.new
    if report.status.to_i == 0
      tracker_status = "otchet"
    elsif report.status.to_i == 2
      tracker_status = "z_close"
    else
      tracker_status = "z_close"
    end
    user_id = soap.get_user_id(report.user_editor.nic) ## Переделать на редактора
    if user_id
      begin
        if report.weld.to_i == 1 
          type_task = 1
        else
          type_task = 2
        end
      response = soap.client.call(:csoap_obji_set_fields, :message => {:order! =>[:user_id, :obji_id, :obji_field_data], :obji_id=>report.tracker_id, :user_id => user_id, :obji_field_data => 
                              {:item1 => {:is_sys_field =>"", :field_tag => "st_arrv_date", :new_value => (report.date.to_time - 3.hours).to_i},
                              :item2 => {:is_sys_field =>"", :field_tag => "alldone", :new_value => (report.date_stop.to_time - 3.hours).to_i},
                                :item15 => {:is_sys_field =>true, :field_tag => "status", :new_value => tracker_status},
                                :item3 => {:is_sys_field =>"", :field_tag => "voznya", :new_value => (report.done_works.map{|i| i.work_name+"("+i.count.to_s+" - "+i.work.price.to_s+" р. )"}.join(', ') + " "+ report.not_standart_work + " " + report.com_stay_work.to_s)},
                              :item4 => {:is_sys_field =>"", :field_tag => "model_snayt", :new_value => report.done_materials.select{|i| i.inst_type.to_i == 4 || (i.inst_type.to_i == 6 && i.pay_type.to_i == 4)}.map{|i| i.material_name+" ("+(i.count.to_i.abs).to_s+")"}.join(', ')},
                                :item5 => {:is_sys_field =>"", :field_tag => "model_ustan", :new_value => report.done_materials.select{|i| i.inst_type.to_i != 4 && i.pay_type.to_i != 4}.map{|i| i.material_name+"("+i.count.to_s+" - "+i.price.to_s+" р. )"}.join(', ')},
                                :item6 => {:is_sys_field =>"", :field_tag =>"stoimost_oborudovaniya", :new_value =>(if report.pay_doc_number.to_s.include?("0000") == true then report.done_materials.map{|i| i.price.to_f*i.count.to_i}.sum else "" end)},
                                :item10 => {:is_sys_field =>"", :field_tag =>"stoimost_oborudovaniya_bn", :new_value =>(if report.money_type == 10 then report.done_materials.map{|i| i.price.to_f*i.count.to_i}.sum else "" end)},
                                :item12 => {:is_sys_field =>"", :field_tag =>"stoimost_oborudovaniya_b4", :new_value =>(if (report.money_type == 10 || report.pay_doc_number.to_s.include?("0000") == true) then "" else report.done_materials.map{|i| i.price.to_f*i.count.to_i}.sum end)},
                                :item7 => {:is_sys_field =>"", :field_tag =>"stoimost_rabot_bn", :new_value =>(if report.money_type == 10 then  report.done_works.map{|i| i.work.price.to_f*i.count.to_i}.sum + report.get_money_sum.to_f else "" end)},
                                :item13 => {:is_sys_field =>"", :field_tag =>"stoimost_rabot_b4", :new_value =>(if (report.money_type == 10 || report.pay_doc_number.to_s.include?("0000")) == true then  "" else report.done_works.map{|i| i.work.price.to_f*i.count.to_i}.sum + report.get_money_sum.to_f end)},
:item14 => {:is_sys_field =>"", :field_tag =>"bso", :new_value =>(report.pay_doc_number)},
                                :item11 => {:is_sys_field =>"", :field_tag =>"stoimost_rabot", :new_value =>(if report.pay_doc_number.to_s.include?("0000") == true then  report.done_works.map{|i| i.work.price.to_f*i.count.to_i}.sum + report.get_money_sum.to_f else "" end)},
                                :item8 => {:is_sys_field =>"", :field_tag => "daignoz_iz_spiska", :new_value => "", :new_value_id => report.diagnosis},
                                :item9 => {:is_sys_field =>"", :field_tag => "forma_oplaty", :new_value => '', :new_value_id => if report.money_type == 0 then 3 elsif report.money_type == 6 then 6 elsif Report::NAL_money_types.include? report.money_type then 1 else 2 end},
                                :item17 => {:is_sys_field =>"", :field_tag =>"test_devices", :new_value =>(if report.done_materials.select{|i| i.pay_type == 6}.size > 0 then 1 else "" end)},
                                :item16 => {:is_sys_field =>"", :field_tag => "type_task", :new_value_id => type_task, :new_value => ""}
                              }
                            }
                                 )
      # ,
      #                          :item16 => {:is_sys_field =>"", :field_tag => "type_task", :new_value => if report.held.to_i == 1 then 1 else 0 end}
    rescue Exception => e
      ActiveRecord::Base.logger.warn "TRACKER SOAP ERROR update REPORT #{report.id}"
    end
    end
    end
  end

 

  def self.create_problem_report(report, editor)
    if report && RAILS_ENV != 'development' && report.problem_tracker_id == nil && (!report.problem_description.nil?  && !report.problem_description.blank?)
      debugger
      case report.department 
      when 'private'
        @otdel = "2"
      when 'corp'
        @otdel = "4"
      when 'mod'
        @otdel = "3"
      when 'soft'
        @otdel = "1"
     when 'alps'
       @otdel = "15"
     when 'ams'
       @otdel = "5"
      end
      link = report.link_for_report
      @dep = 'kosyak_list_other'
      if @otdel
        soap = TrackerSoap.new
        @client = soap.client
        user_id = soap.get_user_id(editor.login)
        if user_id
          response = @client.call(:csoap_obji_create, :message => {:order! =>[:user_id, :obj_tag], :user_id => user_id, :obj_tag => @dep})
          if response.to_hash[:csoap_obji_create_response] != nil
            @tracker_id = response.to_hash[:csoap_obji_create_response][:return]
            response = @client.call(:csoap_obji_set_fields, :message => {:order! =>[:user_id, :obji_id, :obji_field_data], :obji_id=>@tracker_id, :user_id => user_id, :obji_field_data => 
                                      {:item1 => {:is_sys_field =>"", :field_tag => "kogda", :new_value => (report.date.to_time).to_i},
                                        :item2 => {:is_sys_field =>"", :field_tag => "kto", :new_value => editor.login},
                                        :item3 => {:is_sys_field =>"", :field_tag => "link", :new_value => link},
                                        :item4 => {:is_sys_field =>"", :field_tag => "login", :new_value => report.name},
                                        :item5 => {:is_sys_field =>"", :field_tag => "opis", :new_value => report.problem_description},  
                                        :item6 =>{:is_sys_field =>"", :field_tag => "otdel", :new_value_id => @otdel},                               
                                        :item7 => {:is_sys_field =>"", :field_tag => "tags", :new_value => report.problem_tags},                                
                                        :item8 =>{:is_sys_field =>"true", :field_tag => "cond", :new_value => "alive"},
                                        :item9 => {:is_sys_field =>"", :field_tag => "tags2", :new_value => report.downtime_tags}                                
                                                                       
                              }
                            }
                            )
          end
        end
      end
      if @tracker_id
        report.reload.update_attributes(:problem_tracker_id => @tracker_id)
        require 'json'
        require 'httparty'
            begin
              HTTParty.post("http://tt.ner.rinet.ru/api/count_tags", :body => {:tags =>report.problem_ids.split(","), :obji_tag => report.tracker_problem_id}.to_json,  :headers => { 'Content-Type' => 'application/json', 'Accept' => 'application/json' })
              unless report.downtime_ids.to_s.blank?
                HTTParty.post("http://tt.ner.rinet.ru/api/count_tags", :body => {:tags =>report.downtime_ids.split(","), :obji_tag => report.tracker_problem_id}.to_json,  :headers => { 'Content-Type' => 'application/json', 'Accept' => 'application/json' })
              end
            rescue
            end
        return @tracker_id
      end
    end
  end

  def self.set_kozel(report, empl_nic, tracker_id)
    soap = TrackerSoap.new
    @client = soap.client
    kozel_id = soap.get_user_id(empl_nic)
    user_id = soap.get_user_id('annet17')
    if kozel_id && user_id
    response = @client.call(:csoap_obji_set_fields, :message => {:order! =>[:user_id, :obji_id, :obji_field_data], :obji_id=>tracker_id, :user_id => user_id, :obji_field_data => 
                                      {                                       
                                        :item1 => {:is_sys_field =>"", :field_tag => "kozel", :new_value_id => kozel_id.to_s}
                                      }
                                    }
                                    )

    end

  end

  def self.report_to_tracker_about_no_topology(report, editor)
    if report && report.done_employees.size > 0 && RAILS_ENV != 'development'
      case report.department
      when 'private'
        @status = "instalaytory"
      when 'mod'
        @status = "modornizatory"
      end

      if @status
        soap = TrackerSoap.new
        @client = soap.client
        user_id = soap.get_user_id(editor.login)
        kozel_id = soap.get_user_id(report.done_employees.first.empl_name)
        if user_id
          response = @client.call(:csoap_obji_create, :message => {:order! =>[:user_id, :obj_tag], :user_id => user_id, :obj_tag => "lin_sluzhby"})
          if response.to_hash[:csoap_obji_create_response] != nil
            @tracker_id = response.to_hash[:csoap_obji_create_response][:return]
            response = @client.call(:csoap_obji_set_fields, :message => {:order! =>[:user_id, :obji_id, :obji_field_data], :obji_id=>@tracker_id, :user_id => user_id, :obji_field_data => 
                                      {                                       
                                        :item1 => {:is_sys_field =>"", :field_tag => "loginy", :new_value => report.name},
                                        :item2 => {:is_sys_field =>"", :field_tag => "sut", :new_value => "Не сдана топология"},
                                        :item3 => {:is_sys_field =>"", :field_tag => "link", :new_value => report.link_for_report},
                                        :item4 => {:is_sys_field =>"", :field_tag => "kozel", :new_value_id => kozel_id.to_s},
                                        :item5 => {:is_sys_field =>"true", :field_tag => "status", :new_value => @status},    
                                        :item6 =>{:is_sys_field =>"true", :field_tag => "cond", :new_value => "alive"}                                   
                                      }
                                    }
                                    )

          end
        end
        if @tracker_id
          report.reload.update_attributes(:topology_problem_tracker_id => @tracker_id)     
          return @tracker_id
        end
      end
    end
  end

  def self.create_tracker_report_for_soft_from_private(report, editor)
    if report && editor #&& RAILS_ENV != 'development'
      soap = TrackerSoap.new
      @client = soap.client
      user_id = soap.get_user_id(editor.login)
      if user_id
        response = @client.call(:csoap_obji_create, :message => {:order! =>[:user_id, :obj_tag], :user_id => user_id, :obj_tag => "soft"})
        if response.to_hash[:csoap_obji_create_response] != nil
          comment = "Заведена из отчёта по подключению (" + report.request_link + "). Сотрудник " + editor.login.to_s + ": " + report.comment_for_soft_new_tracker_report.to_s
          if report.login
            mobile = report.login.mobile
          else
            mobile = ""
          end
          @tracker_id = response.to_hash[:csoap_obji_create_response][:return]
          response = @client.call(:csoap_obji_set_fields, :message => {:order! =>[:user_id, :obji_id, :obji_field_data], :obji_id=>@tracker_id, :user_id => user_id, :obji_field_data => 
                                    {                                       
                                      :item1 => {:is_sys_field =>"", :field_tag => "client_type", :new_value => "", :new_value_id =>  "chastn"},
                                      :item2 => {:is_sys_field =>"", :field_tag => "login", :new_value => report.name},
                                      :item3 => {:is_sys_field =>"", :field_tag => "phone", :new_value => mobile},
                                      :item4 => {:is_sys_field =>"", :field_tag => "prev_diagn", :new_value => comment},                
                                      :item5 => {:is_sys_field =>"true", :field_tag => "status", :new_value => "init_ta"},    
                                      :item6 =>{:is_sys_field =>"true", :field_tag => "cond", :new_value => "alive"}                                   
                                    }
                                  }
                                  )
          if @tracker_id
            ReportMailer.deliver_new_tracker_report_for_soft_from_private(report, editor, @tracker_id, comment)
          end
        end
      end
    end
  end

end
