package main

import (
	"database/sql"
	"git.kuschku.de/justjanne/imghost-frontend/shared"
	"net/http"
	"path"
	"strconv"
)

type ImageListData struct {
	User     UserInfo
	Images   []shared.Image
	Previous int64
	Current  int64
	Next     int64
}

const PageSize = 30

func paginateImageListQuery(ctx PageContext, user UserInfo, offset int64, pageSize int) (*sql.Rows, error) {
	if offset == 0 {
		return ctx.Database.Query(`
			SELECT
				id,
				coalesce(title,  ''),
				coalesce(description, ''),
        		coalesce(created_at, to_timestamp(0)),
				coalesce(original_name, ''),
				coalesce(type, '')
			FROM images
			WHERE owner = $1
			ORDER BY created_at DESC
			LIMIT $2
		`, user.Id, pageSize)
	} else {
		return ctx.Database.Query(`
			SELECT
				id,
				coalesce(title,  ''),
				coalesce(description, ''),
        		coalesce(created_at, to_timestamp(0)),
				coalesce(original_name, ''),
				coalesce(type, '')
			FROM images
			WHERE owner = $1
			ORDER BY created_at DESC
			LIMIT $3
			OFFSET $2
		`, user.Id, offset, pageSize)
	}
}

func pageImageList(ctx PageContext) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		user := parseUser(r)
		_, page := path.Split(r.URL.Path)
		var pageNumber int64
		pageNumber, err := strconv.ParseInt(page, 10, 64)
		if err != nil {
			pageNumber = 1
		}

		result, err := paginateImageListQuery(
			ctx,
			user,
			(pageNumber-1)*PageSize,
			PageSize,
		)
		if err != nil {
			formatError(w, ErrorData{500, user, r.URL, err}, "html")
			return
		}

		var images []shared.Image
		for result.Next() {
			var info shared.Image
			if err := result.Scan(&info.Id, &info.Title, &info.Description, &info.CreatedAt, &info.OriginalName, &info.MimeType); err != nil {
				formatError(w, ErrorData{500, user, r.URL, err}, "html")
				return
			}
			images = append(images, info)
		}

		if err = formatTemplate(w, "image_list.html", ImageListData{
			user,
			images,
			pageNumber - 1,
			pageNumber,
			pageNumber + 1,
		}); err != nil {
			formatError(w, ErrorData{500, user, r.URL, err}, "html")
			return
		}
	})
}