require 'fileutils'

module Eye::Local

  class << self

    def dir
      @dir ||= begin
        if root?
          if (_home = ENV['EYE_HOME']) && !_home.empty?
            File.expand_path(File.join(_home, '.eye'))
          else
            '/var/run/eye'
          end
        else
          File.expand_path(File.join(home, '.eye'))
        end
      end
    end

    attr_writer :dir, :client_timeout, :host

    def global_eyeconfig
      '/etc/eye.conf'
    end

    def eyeconfig
      File.expand_path(File.join(home, '.eyeconfig'))
    end

    def root?
      Process::UID.eid == 0
    end

    def home
      h = ENV['EYE_HOME'] || ENV['HOME']
      raise 'HOME undefined, should be HOME or EYE_HOME environment' unless h
      h
    end

    def path(path)
      File.expand_path(path, dir)
    end

    def ensure_eye_dir
      FileUtils.mkdir_p(dir) unless ENV['EYE_SOCK'] && ENV['EYE_PID']
    end

    def socket_path
      path(ENV['EYE_SOCK'] || "sock#{ENV['EYE_V']}")
    end

    def pid_path
      path(ENV['EYE_PID'] || "pid#{ENV['EYE_V']}")
    end

    def cache_path
      path("processes#{ENV['EYE_V']}.cache")
    end

    def default_client_timeout
      (ENV['EYE_CLIENT_TIMEOUT'] || 5).to_i
    end

    def client_timeout
      @client_timeout ||= default_client_timeout
    end

    def supported_setsid?
      RUBY_VERSION >= '2.0'
    end

    def host
      @host ||= begin
        require 'socket'
        Socket.gethostname
      end
    end

    def eyefile
      @eyefile ||= find_eyefile(ENV['EYE_HOME'] || '.')
    end

    def find_eyefile(start_from_dir)
      fromenv = ENV['EYE_FILE']
      return fromenv if fromenv && !fromenv.empty? && File.file?(fromenv)

      previous = nil
      current  = File.expand_path(start_from_dir)

      until !File.directory?(current) || current == previous
        filename = File.join(current, 'Eyefile')
        return filename if File.file?(filename)
        previous = current
        current = File.expand_path('..', current)
      end
    end

    attr_accessor :local_runner

  end

end
