
desc "导入禅道数据"
namespace :import_from_chandao do

  def get_sprint_data(name, pm_project_id, org)
    assigner = org.team_users.joins(:team).where(teams: {authorize: "owner"}).take&.user
    url = URI("#{EduSetting.get("pms_server_url")}/api/pms/#{org.login}/pmsProjectSprint/findOrCreate")

    http = Net::HTTP.new(url.host, url.port);
    request = Net::HTTP::Post.new(url)
    request["Cookie"] = "autologin_trustie=#{Token.get_or_create_permanent_login_token(assigner, 'autologin')&.value}"
    request["Content-Type"] = "application/json"
    request.body = JSON.dump({
      "pmsProjectId": pm_project_id,
      "sprintAssigneeId": assigner.id,
      "sprintName": name
    })

    response = http.request(request)
    puts response.read_body
    return JSON.parse(response.read_body)['data']
  rescue 
    return nil
  end

  def get_chandao_json(api_url)
    url = URI("#{EduSetting.get("chandao_server_url")}#{api_url}")
    http = Net::HTTP.new(url.host, url.port);
    request = Net::HTTP::Post.new(url)
    request["Cookie"] = "zentaosid=#{EduSetting.get("chandao_sid")}"
    response = http.request(request)
    response.read_body
    return JSON.parse(JSON.parse(response.read_body)['data'])
  rescue 
    return {}
  end

  def trans_content_img(content, user)
    respace_content_arr = content.to_s.scan(/<img\s+[^>]*?src=[“.*?“][^>]*?\/?>/).map{|s|[s,s.match(/(\d+\.\w+)/)[0].split(".")[0],s.match(/(\d+\.\w+)/)[0].split(".")[1]]}
    respace_content_arr.each do |img|
      remote_image_url = "#{EduSetting.get("chandao_server_url")}/file-read-#{img[1]}.json"
      attachment = Attachment.build_from_remote_url(user, img[1..2].join("."), remote_image_url)
           
      att_url = "#{Rails.application.config_for(:configuration)['platform_url']}/api/attachments/#{attachment.uuid}"
      content.gsub!(img[0], "![](#{att_url})")
    end
    return content
  end

  desc "bug数据"
  # 执行示例 bundle exec rake "import_from_chandao:bugs[企业内部工时管理系统.csv, 3, ceshi_org]"
  # RAILS_ENV=production bundle exec rake "import_from_chandao:bugs[企业内部工时管理系统.csv, 3, ceshi_org]"
  task :bugs, [:name, :pm_project_id, :org_login] => :environment do |t, args|
    org = Organization.find_by(login: args.org_login)
    if org.present? 
      def trans_status(str)
        h={
          "激活" => 1,
          "已解决" => 3,
          "已关闭" => 5
        }
        h[str]
      end 
      name = args.name
      CSV.foreach("#{Rails.root}/#{args.name}", headers: true) do | row |
        randd_field_hash = row.to_hash
        issue = Issue.new(issue_classify: "issue")
        author = User.like(randd_field_hash['由谁创建']).take || User.where(admin: true).first
        issue.author_id = author&.id 
        assigner = randd_field_hash['指派给'].present? ? User.like(randd_field_hash['指派给']).take : nil
        if assigner.present? 
          issue.assigners << assigner
        end
        issue.project_issues_index = randd_field_hash['Bug编号'].to_i
        issue.status_id = trans_status(randd_field_hash['Bug状态']) || IssueStatus.first.id
        issue.tracker_id = Tracker.first.id
        issue.priority_id = randd_field_hash['优先级'].split('P')[-1].to_i rescue 1
        issue.subject = randd_field_hash['Bug标题']
        issue.description = trans_content_img(randd_field_hash['重现步骤'].to_s, author)
        issue.created_on = randd_field_hash['创建日期'].to_time rescue nil
        issue.updated_on = randd_field_hash['修改日期'].to_time rescue issue.created_on
        issue.due_date = randd_field_hash['截止日期'].to_time rescue nil
        issue.project_id = 0 
        issue.pm_project_id = args.pm_project_id
        issue.pm_issue_type = 3
        sprint = get_sprint_data(randd_field_hash['所属迭代'].split('(#')[0], args.pm_project_id, org) rescue nil
        issue.pm_sprint_id = sprint['id'] if sprint.present?
        issue.save!
        requirement_issue = Issue.find_by(project_issues_index: randd_field_hash['相关需求'].split('(#')[1].split(')')[0], pm_project_id: args.pm_project_id, pm_issue_type: 1) rescue nil
        if requirement_issue.present? 
          requirement_issue.pm_links.find_or_create_by(be_linkable_type: 'Issue', be_linkable_id: issue.id)
        end
        task_issue = Issue.find_by(project_issues_index: randd_field_hash['相关任务'].split('(')[1].split(')')[0], pm_project_id: args.pm_project_id, pm_issue_type: 2) rescue nil
        if task_issue.present? 
          task_issue.pm_links.find_or_create_by(be_linkable_type: 'Issue', be_linkable_id: issue.id)
        end
      end
    else
      puts "组织不存在"
    end
  end

  # 执行示例 bundle exec rake "import_from_chandao:tasks[复杂智能软件项目-所有任务.csv, 365, ceshi_org]"
  # RAILS_ENV=production bundle exec rake "import_from_chandao:tasks[复杂智能软件项目-所有任务.csv, 365, ceshi_org]"
  task :tasks, [:name, :pm_project_id, :org_login] => :environment do |t, args| 
    org = Organization.find_by(login: args.org_login)
    if org.present? 
      def trans_status(str)
        h={
          "未开始" => 1,
          "进行中" => 2,
          "已完成" => 3,
          "已关闭" => 5
        }
        h[str]
      end 
        
      name = args.name
      pm_project_id = args.pm_project_id
      CSV.foreach("#{Rails.root}/#{name}", headers: true) do | row |
        randd_field_hash = row.to_hash
        issue = Issue.new(issue_classify: "issue")
        author = User.like(randd_field_hash['由谁创建']).take || User.where(admin: true).first
        issue.author_id = author&.id 
        assigner = randd_field_hash['指派给'].present? ? User.like(randd_field_hash['指派给']).take : nil
        if assigner.present? 
          issue.assigners << assigner
        end
        issue.project_issues_index = randd_field_hash['编号'].to_i
        issue.status_id = trans_status(randd_field_hash['任务状态']) || IssueStatus.first.id
        issue.tracker_id = Tracker.first.id
        issue.priority_id = randd_field_hash['优先级'].to_i
        issue.subject = randd_field_hash['任务名称']
        issue.description = trans_content_img(randd_field_hash['任务描述'].to_s, author)
        issue.created_on = randd_field_hash['创建日期'].to_time rescue nil
        issue.updated_on = randd_field_hash['最后修改日期'].to_time rescue issue.created_on
        issue.time_scale = randd_field_hash['最初预计'].to_i
        issue.start_date = randd_field_hash['预计开始'].to_time rescue nil
        issue.due_date = randd_field_hash['截止日期'].to_time rescue nil
        issue.project_id = 0 
        issue.pm_project_id = pm_project_id
        issue.pm_issue_type = 2
        sprint = get_sprint_data(randd_field_hash['所属迭代'].split('(#')[0], args.pm_project_id, org) rescue nil
        issue.pm_sprint_id = sprint['id'] if sprint.present?
        issue.save!
        requirement_issue = Issue.find_by(project_issues_index: randd_field_hash['相关需求'].split('(#')[1].split(')')[0], pm_project_id: pm_project_id, pm_issue_type: 1) rescue nil
        if requirement_issue.present? 
          requirement_issue.pm_links.find_or_create_by(be_linkable_type: 'Issue', be_linkable_id: issue.id)
        end
      end
    else 
      puts '组织不存在'
    end
  end

  # 执行示例 bundle exec rake "import_from_chandao:requirements[企业网站第二期.csv, 3, ceshi_org]"
  # RAILS_ENV=production bundle exec rake "import_from_chandao:requirements[企业网站第二期.csv, 3, ceshi_org]"
  task :requirements, [:name, :pm_project_id, :org_login] => :environment do |t, args|
    org = Organization.find_by(login: args.org_login)
    if org.present?  
      def trans_status(str)
        h={
          "草稿" => 1,
          "激活" => 1,
          "已关闭" => 5
        }
        h[str]
      end 
      name = args.name
      pm_project_id = args.pm_project_id
      CSV.foreach("#{Rails.root}/#{name}", headers: true) do | row |
        randd_field_hash = row.to_hash
        issue = Issue.new(issue_classify: "issue")
        author = User.like(randd_field_hash['由谁创建']).take || User.where(admin: true).first
        issue.author_id = author&.id 
        assigner = randd_field_hash['指派给'].present? ? User.like(randd_field_hash['指派给']).take : nil
        if assigner.present? 
          issue.assigners << assigner
        end
        issue.project_issues_index = randd_field_hash['编号'].to_i
        issue.status_id = trans_status(randd_field_hash['当前状态']) || IssueStatus.first.id
        issue.tracker_id = Tracker.first.id
        issue.priority_id = randd_field_hash['优先级'].to_i
        issue.subject = randd_field_hash['需求名称']
        issue.description = trans_content_img(randd_field_hash['需求描述'].to_s, author)
        issue.created_on = randd_field_hash['创建日期'].to_time
        issue.updated_on = randd_field_hash['最后修改日期'].to_time rescue randd_field_hash['创建日期'].to_time 
        issue.time_scale = randd_field_hash['预计工时'].to_i
        issue.project_id = 0 
        issue.pm_project_id = pm_project_id
        issue.pm_issue_type = 1
        issue.save!
      end
    else 
      puts '组织不存在'
    end
  end
end