# -*- coding: utf-8 -*-
class Tracker
# Формат обмена: JSON
#Авторизация в трекере происходит по логину и паролю, зашифрованным SHA1. Пароль передаётся только один раз при начале сессии, в дальнейшем вместо него используется токен авторизации, полученный в результате операции "Логин/привязка клиента":
# В поле "key" -- MD5 от преобразованных в lowercase-строку и склеенных *значений* всех остальных переменных запроса, кроме timestamp.
# порядок — алфавитный по именам (а не значениям) переменных с учётом вложенности (то есть, поля из вложенных секций сортируются без
# нарушения группировки по секциям). Плюс соль "tumbo4ka" в конце,
# то есть для запроса выше token = md5(lowercase('mm_remote4f6528801cbadb027deeb6a35255d6c5d658bfffauthmmtumbo4ka')) :
# сперва секция 'data' которая первая по алфавиту, в ней первый login, потом password. после (секция data закончилась) идёт значение operation,
# которая по алфавиту следующая за data и далее в том же духе.
# логика своеобразная, но так склалось)) aналогично формируется поле key и в остальных запросах.
#2. Обновление полей заявки
#==========================
#----запрос:

#    {"realm" : "mm", "operation" : "updateObji", "data":{"login" : "kuku","token" : "3381dad339e3c08d24094bafae465dba","obji_id": id, "fields" : {"field1_tag" : "value1","field2_tag" : "value2"}}, "timestamp" : "1330686681", "key" : "370f48a8657d0bb7c5e9009b5a3efc71"}
#----ответ:
#{ "result" : true }

#3. Получение полей заявки
#=========================
#----запрос:
#{"realm" : "mm", "operation" : "objiFields", "data": {"login" : "kuku","token" : "3381dad339e3c08d24094bafae465dba", "obji_id": id} "timestamp" : "1330686681", "key" : "370f48a8657d0bb7c5e9009b5a3efc71"}
#----ответ:
  # {"result" : true, "data":{"fields": {"tag1" : { "txt" : "value1_txt" , "int" : "value1_internal" }, "tag2" : { "txt" : "value2_txt" },}
#Здесь в секции "fields" для тэга возвращаются одно или два значения: "txt" это текстовое представление значения поля, то, что показывается людям в "трекере". "int" -- внутреннее представление поля, оно возвращается только если не совпадает с текстовым.
#днапример для полей типа дата/время там находится UNIX timestamp, для списковых полей -- id пункта списка.

  require 'httparty'
  include HTTParty
  base_uri "http://tracker.rinet.ru/crxjson/srv.php"
  #debug_output


  
  def self.get_token
    get_key = Digest::MD5.hexdigest("mm_remotevuiS8pi2authmmtumbo4ka")
 #   string = '{"realm":"mm", "operation":"auth", "data":{"login":"mm_remote","password":"348162101fc6f7e624681b7400b085eeac6df7bd"}, "key":"'+get_key+'", "timestamp":"#{Time.now.to_i}"}'
    string = '{"realm":"mm", "operation":"auth", "data":{"login":"mm_remote","password":"vuiS8pi2"}, "key":"'+get_key+'", "timestamp":"#{Time.now.to_i}"}'
#    get_key = Digest::MD5.hexdigest("trackerman1122334455authmmtumbo4ka")
#    string = '{"realm":"mm", "operation":"auth", "data":{"login":"trackerman","password":"1122334455"}, "key":"'+get_key+'", "timestamp":"#{Time.now.to_i}"}'
    @get_token = self.get('http://tracker.rinet.ru/crxjson/srv.php', :body =>string)
    puts @get_token.parsed_response
   # @token = MultiJson.load(@get_token.parsed_response)["data"]["token"]
  end 

 def self.get_token2
    get_key = Digest::MD5.hexdigest("annet172135579authmmtumbo4ka")
    string = '{"realm":"mm", "operation":"auth", "data":{"login":"annet17","password":"2135579"}, "key":"'+get_key+'", "timestamp":"#{Time.now.to_i}"}'
#    get_key = Digest::MD5.hexdigest("trackerman1122334455authmmtumbo4ka")
#    string = '{"realm":"mm", "operation":"auth", "data":{"login":"trackerman","password":"1122334455"}, "key":"'+get_key+'", "timestamp":"#{Time.now.to_i}"}'
    @get_token = self.get('http://tracker.rinet.ru/crxjson/srv.php', :body =>string)
    @token = MultiJson.load(@get_token.parsed_response)["data"]["token"]
  end 


  def self.get_user_id(nic)
    token = self.get_token
    string = nic+"mm_remote"+token+ "getUserByLogin"+"mm"+"tumbo4ka"
    key = Digest::MD5.hexdigest(string.downcase)
    send_string = '{"realm":"mm", "operation":"getUserByLogin", "data":{"login":"mm_remote","find_login":"'+nic+'","token":"'+token+'"}, "key":"'+key+'", "timestamp":"'+Time.now.to_i.to_s+'"}'
    response = self.get('http://tracker.rinet.ru/crxjson/srv.php', :body =>send_string)
    dat = MultiJson.load(response.parsed_response)["data"]
    if dat
      return dat["user_id"]
    else
      return false
    end
  end


  def self.get_report(report_id)
#----запрос:
#{"realm" : "mm", "operation" : "objiFields", "data": {"login" : "kuku","token" : "3381dad339e3c08d24094bafae465dba", "obji_id": id} "timestamp" : "1330686681", "key" : "370f48a8657d0bb7c5e9009b5a3efc71"}
#----ответ:
  # {"result" : true, "data":{"fields": {"tag1" : { "txt" : "value1_txt" , "int" : "value1_internal" }, "tag2" : { "txt" : "value2_txt" },}
    token = self.get_token
    string = ''
    string += "mm_remote"
    string += report_id.to_s
    string += token
    string += "objiFields"
    string += "mm"
    string += "tumbo4ka"
    key = Digest::MD5.hexdigest(string.downcase)
    send_string = '{"realm":"mm", "operation":"objiFields", "data":{"login":"mm_remote","token":"'+token+'","obji_id":"'+report_id.to_s+'"}, "key":"'+key+'", "timestamp":"'+Time.now.to_i.to_s+'"}'
    response = self.get('http://tracker.rinet.ru/crxjson/srv.php', :body =>send_string)
    report_fields = MultiJson.load(response.parsed_response)["data"]
    return report_fields
#    status = report_fields["sys::status"]
  end

  def self.get_reports_for_sozvons(date)
    reports = Report.soft.with_status(2).in_month(date.to_date)
    ret_reps = { }
    token = self.get_token
    for report in reports do
      report_id = report.tracker_id
     if report_id.nil? || report_id == 0
     else
        string = "mm_remote"+report_id.to_s+token+"objiFields"+"mm"+"tumbo4ka"
        key = Digest::MD5.hexdigest(string.downcase)
        send_string = '{"realm":"mm", "operation":"objiFields", "data":{"login":"mm_remote","token":"'+token+'","obji_id":"'+report_id.to_s+'"}, "key":"'+key+'", "timestamp":"'+Time.now.to_i.to_s+'"}'
        response = self.get('http://tracker.rinet.ru/crxjson/srv.php', :body =>send_string)
        report_fields = MultiJson.load(response.parsed_response)["data"]
        nic = report_fields["sys::created_by"]["txt"]
        if ret_reps.include? nic
          ret_reps[nic] += report.to_a
        else
          ret_reps[nic] = report.to_a
        end
      end
    end
    return ret_reps
  end

  def self.update_fields(id, fields)
    #    {"realm" : "mm", "operation" : "updateObji", "data":{"login" : "kuku","token" : "3381dad339e3c08d24094bafae465dba","obji_id": id, "fields" : {"field1_tag" : "value1","field2_tag" : "value2"}}, "timestamp" : "1330686681", "key" : "370f48a8657d0bb7c5e9009b5a3efc71"}
    token = self.get_token
    string = ''
    fields.sort.map{|field_name, field_value| string += field_value.to_s}
    #"field1_tag" : "value1","field2_tag" : "value2"
    string += "mm_remote"
    string += id.to_s
    string += token
    string += "updateObji"
    string += "mm"
    string += "tumbo4ka"
    key = Digest::MD5.hexdigest(string.downcase)
    fields_for_send = MultiJson.dump(fields)
    send_string = '{"realm":"mm", "operation":"updateObji", "data":{"login":"mm_remote","token":"'+token+'","obji_id":"'+id.to_s+'", "fields":'+fields_for_send+'}, "key":"'+key+'", "timestamp":"'+Time.now.to_i.to_s+'"}'   
    response = self.get('http://tracker.rinet.ru/crxjson/srv.php', :body =>send_string)
  end

  def self.update_soft(report)

    ## Переделать на json когда Алехо сделает
  #  soap = TrackerSoap.new
  #  @client = soap.client
  #  user_id = TrackerSoap.get_user_id(@client, report.user_editor.login)
    ### /Переделать на json когда Алехо сделает,а нужно ли?
    

   fields = { }
    fields["model_snayt"] = "123tes222t"
 
    token = self.get_token

    string = ''
    fields.sort.map{|field_name, field_value| string += field_value.to_s}
    string += "mm_remote"+report.tracker_id.to_s+token+"updateObji"+"mm"+"tumbo4ka"
    key = Digest::MD5.hexdigest(string.downcase)
    fields_for_send = MultiJson.dump(fields)
    send_string = '{"realm":"mm", "operation":"updateObji", "data":{"login":"mm_remote","token":"'+token+'","obji_id":"'+report.tracker_id.to_s+'", "fields":'+fields_for_send+'}, "key":"'+key+'", "timestamp":"'+Time.now.to_i.to_s+'"}'   

#    send_string = '{"realm":"mm", "operation":"updateObji", "data":{"login":"mm_remote","token":"'+token+'","obji_id":"'+report.tracker_id.to_s+'", "fields":'+fields_for_send+'}, "key":"'+key+'", "timestamp":"'+Time.now.to_i.to_s+'"}'
    response = self.get('http://tracker.rinet.ru/crxjson/srv.php', :body =>send_string)
    response.body
  end


  def new
    require 'json'
   # Remote::TrackerAuth.find(:first)
    string = '{"realm":"mm", "operation":"auth", "data":{"login":"mm_remote","password":"4f6528801cbadb027deeb6a35255d6c5d658bfff"}, "timestamp":"#{Time.now.to_i}", "key":"370f48a8657d0bb7c5e9009b5a3efc71"}'
'{"desc":{"someKey":"someValue","anotherKey":"value"},"main_item":{"stats":{"a":8,"b":12,"c":10}}}'
    hash = JSON.parse string
  end


end
