module RepositoriesHelper
  def render_permission(user, project)
    return "Admin" if user&.admin?
    project.get_premission(user)
  end

  def render_decode64_content(str)
    return nil if str.blank?
    Base64.decode64(str).force_encoding("UTF-8").encode("UTF-8", invalid: :replace)
  end

  def download_type(str)
    default_type = %w(xlsx xls ppt pptx pdf zip 7z rar exe pdb obj idb RData rdata doc docx mpp vsdx dot otf eot ttf woff woff2)
    default_type.include?(str&.downcase)
  end

  def image_type?(str)
    default_type = %w(png jpg gif tif psd svg bmp webp jpeg)
    default_type.include?(str&.downcase)
  end

  def is_readme?(type, str)
    return false if type != 'file' || str.blank?
    readme_types = ["readme.md", "readme", "readme_en.md", "readme_zh.md", "readme_en", "readme_zh"]
    readme_types.include?(str.to_s.downcase)
  end

  def render_commit_author(author_json)
    return nil if author_json.blank? || (author_json["id"].blank? && author_json['name'].blank?)
    if author_json["id"].present?
      return find_user_by_gitea_uid author_json['id']
    end
    if author_json["id"].nil? && (author_json["name"].present? && author_json["email"].present?)
      return find_user_by_login_and_mail(author_json['name'], author_json["email"])
    end
  end

  def readme_render_decode64_content(str, path)
    return nil if str.blank?
    begin
      content = Base64.decode64(str).force_encoding('UTF-8')

      c_regex = /\!\[.*?\]\((.*?)\)/
      src_regex = /src=\"(.*?)\"/
      ss = content.to_s.scan(c_regex)
      ss_src = content.to_s.scan(src_regex)
      total_images = ss + ss_src
      if total_images.length > 0
        total_images.each do |s|
          image_title = /\"(.*?)\"/
          r_content = s[0]
          remove_title = r_content.to_s.scan(image_title)
          if remove_title.length > 0
            r_content = r_content.gsub(/#{remove_title[0]}/, "").strip
          end
          if r_content.include?("?")
            new_r_content = r_content + "&raw=true"
          else
            new_r_content = r_content + "?raw=true"
          end
          unless r_content.include?("http://") || r_content.include?("https://") || r_content.include?("mailto:")
            new_r_content = "#{path}" + new_r_content
          end
          content = content.gsub(/#{r_content}/, new_r_content)
        end
      end
  
      return content
    rescue
      return str
    end
  end

  # unix_time values for example: 1604382982
  def render_format_time_with_unix(unix_time)
    Time.at(unix_time).strftime("%Y-%m-%d %H:%M")
  end

  # date for example: 2020-11-01T19:57:27+08:00
  def render_format_time_with_date(date)
    date.to_time.strftime("%Y-%m-%d %H:%M")
  end

  def decode64_content(entry, owner, repo, ref, path=nil)
    if is_readme?(entry['type'], entry['name'])
      content = Gitea::Repository::Entries::GetService.call(owner, repo.identifier, URI.escape(entry['path']), ref: ref)['content']
      readme_render_decode64_content(content, path)
    else
      file_type = File.extname(entry['name'].to_s)[1..-1]
      if image_type?(file_type)
        return entry['content'].nil? ? Gitea::Repository::Entries::GetService.call(owner, repo.identifier, URI.escape(entry['path']), ref: ref)['content'] : entry['content']  
      end
      if download_type(file_type)
        return entry['content']
      end
      render_decode64_content(entry['content'])
    end
  end

  def base64_to_image(path, content)
    # generate to https://git.trusite.net/pawm36ozq/-/raw/branch/master/entrn.png"
    content      = Base64.decode64(content)
    File.open(path, 'wb') { |f| f.write(content) }
  end
  
  def render_download_image_url(dir_path, file_path, content)
    full_path = file_path.starts_with?("/") ? [dir_path, file_path].join("") : [dir_path, file_path].join("/")
    file_name = full_path.split("/")[-1]
    # 用户名/项目标识/文件路径
    dir_path = generate_dir_path(full_path.split("/"+file_name)[0])

    file_path = [dir_path, file_name].join('/')

    puts "##### render_download_image_url file_path: #{file_path}"
    base64_to_image(file_path, content)
    file_path = file_path[6..-1]
    File.join(base_url, file_path)
  end
  
  def generate_dir_path(dir_path)
    # tmp_dir_path
    # eg: jasder/forgeplus/raw/branch/ref
    dir_path = ["public", tmp_dir, dir_path].join('/')
    puts "#### dir_path: #{dir_path}"
    unless Dir.exists?(dir_path)
      FileUtils.mkdir_p(dir_path) ##不成功这里会抛异常
    end
    dir_path
  end

  def tmp_dir
    "repo"
  end
  
end
