# Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/
class Store::Provider::File

  # write file to fs
  def self.add(data, sha)

    # install file
    permission = '600'
    if !File.exist?( get_locaton(sha) )
      Rails.logger.debug "storge write '#{get_locaton(sha)}' (#{permission})"
      file = File.new( get_locaton(sha), 'wb' )
      file.write( data )
      file.close
    end
    File.chmod( permission.to_i(8), get_locaton(sha) )

    # check sha
    local_sha = Digest::SHA256.hexdigest( get(sha) )
    if sha != local_sha
      fail "ERROR: Corrupt file in fs #{get_locaton(sha)}, sha should be #{sha} but is #{local_sha}"
    end

    true
  end

  # read file from fs
  def self.get(sha)
    Rails.logger.debug "read from fs #{get_locaton(sha)}"
    if !File.exist?( get_locaton(sha) )
      fail "ERROR: No such file #{get_locaton(sha)}"
    end
    data    = File.open( get_locaton(sha), 'rb' )
    content = data.read

    # check sha
    local_sha = Digest::SHA256.hexdigest( content )
    if local_sha != sha
      fail "ERROR: Corrupt file in fs #{get_locaton(sha)}, sha should be #{sha} but is #{local_sha}"
    end
    content
  end

  # unlink file from fs
  def self.delete(sha)
    if File.exist?( get_locaton(sha) )
      Rails.logger.info "storge remove '#{get_locaton(sha)}'"
      File.delete( get_locaton(sha) )
    end
  end

  # generate file location
  def self.get_locaton(sha)

    # generate directory
    base     = "#{Rails.root}/storage/fs/"
    parts    = sha.scan(/.{1,4}/)
    path     = parts[ 1..10 ].join('/') + '/'
    file     = parts[ 11..parts.count ].join('')
    location = "#{base}/#{path}"

    # create directory if not exists
    if !File.exist?( location )
      FileUtils.mkdir_p( location )
    end
    location += file
  end

end
