// 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 (
	"errors"
	"io"
	"log"
	"net/http"
	"path"

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

func (s *Server) serveScrape(w http.ResponseWriter, r *http.Request) {
	// Parse the query
	pq, err := parseQuery(r.URL.RawQuery)
	if err != nil {
		fail(errors.New("Error parsing query"), w, r)
		return
	}

	// Start a transaction
	tx, err := s.dbConnPool.Get()
	if err != nil {
		log.Fatal(err)
	}

	// Find and validate the user
	passkey, _ := path.Split(r.URL.Path)
	_, err = validateUser(tx, passkey)
	if err != nil {
		fail(err, w, r)
		return
	}

	io.WriteString(w, "d")
	writeBencoded(w, "files")
	if pq.Infohashes != nil {
		for _, infohash := range pq.Infohashes {
			torrent, exists, err := tx.FindTorrent(infohash)
			if err != nil {
				log.Panicf("server: %s", err)
			}
			if exists {
				writeBencoded(w, infohash)
				writeScrapeInfo(w, torrent)
			}
		}
	} else if infohash, exists := pq.Params["info_hash"]; exists {
		torrent, exists, err := tx.FindTorrent(infohash)
		if err != nil {
			log.Panicf("server: %s", err)
		}
		if exists {
			writeBencoded(w, infohash)
			writeScrapeInfo(w, torrent)
		}
	}
	io.WriteString(w, "e")

	// Finish up and write headers
	r.Close = true
	w.Header().Add("Content-Type", "text/plain")
	w.Header().Add("Connection", "close")
	w.(http.Flusher).Flush()
}

func writeScrapeInfo(w io.Writer, torrent *models.Torrent) {
	io.WriteString(w, "d")
	writeBencoded(w, "complete")
	writeBencoded(w, len(torrent.Seeders))
	writeBencoded(w, "downloaded")
	writeBencoded(w, torrent.Snatches)
	writeBencoded(w, "incomplete")
	writeBencoded(w, len(torrent.Leechers))
	io.WriteString(w, "e")
}