// Copyright 2013 The Chihaya Authors. All rights reserved.
// Use of this source code is governed by the BSD 2-Clause license,
// which can be found in the LICENSE file.

package server

import (
	"io"
	"net/http"

	log "github.com/golang/glog"

	"github.com/chihaya/chihaya/bencode"
	"github.com/chihaya/chihaya/models"
)

func (s *Server) serveScrape(w http.ResponseWriter, r *http.Request) {
	scrape, err := models.NewScrape(r, s.conf)
	if err != nil {
		fail(err, w, r)
		return
	}

	conn, err := s.trackerPool.Get()
	if err != nil {
		fail(err, w, r)
	}

	if s.conf.Private {
		_, err = conn.FindUser(scrape.Passkey)
		if err != nil {
			fail(err, w, r)
			return
		}
	}

	var torrents []*models.Torrent
	for _, infohash := range scrape.Infohashes {
		torrent, err := conn.FindTorrent(infohash)
		if err != nil {
			fail(err, w, r)
			return
		}
		torrents = append(torrents, torrent)
	}

	bencoder := bencode.NewEncoder(w)
	bencoder.Encode("d")
	bencoder.Encode("files")
	for _, torrent := range torrents {
		writeTorrentStatus(w, torrent)
	}
	bencoder.Encode("e")

	log.V(3).Infof("chihaya: handled scrape from %s", r.RemoteAddr)

	w.(http.Flusher).Flush()
}

func writeTorrentStatus(w io.Writer, t *models.Torrent) {
	bencoder := bencode.NewEncoder(w)
	bencoder.Encode("t.Infohash")
	bencoder.Encode("d")
	bencoder.Encode("complete")
	bencoder.Encode(len(t.Seeders))
	bencoder.Encode("downloaded")
	bencoder.Encode(t.Snatches)
	bencoder.Encode("incomplete")
	bencoder.Encode(len(t.Leechers))
	bencoder.Encode("e")
}