package entity

import (
	"strings"
	"time"

	"github.com/photoprism/photoprism/pkg/txt"
)

var QualityBlacklist = map[string]bool{
	"screenshot":  true,
	"screenshots": true,
	"info":        true,
}

var (
	year2008 = time.Date(2008, 1, 1, 0, 0, 0, 0, time.UTC)
	year2012 = time.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC)
)

// QualityScore returns a score based on photo properties like size and metadata.
func (m *Photo) QualityScore() (score int) {
	if m.PhotoFavorite {
		score += 3
	}

	if SrcPriority[m.TakenSrc] > SrcPriority[SrcEstimate] {
		score++
	}

	if m.TrustedLocation() {
		score++
	}

	if m.TakenAt.Before(year2008) {
		score++
	} else if m.TakenAt.Before(year2012) && m.PhotoResolution >= 1 {
		score++
	} else if m.PhotoResolution >= 2 {
		score++
	}

	blacklisted := false

	details := m.GetDetails()

	if details.Keywords != "" {
		keywords := txt.Words(details.Keywords)

		for _, w := range keywords {
			w = strings.ToLower(w)

			if _, ok := QualityBlacklist[w]; ok {
				blacklisted = true
				break
			}
		}
	}

	if !blacklisted {
		score++
	}

	if score < 3 && (m.PhotoType != MediaImage || m.EditedAt != nil) {
		score = 3
	}

	return score
}

// UpdateQuality updates the photo quality attribute.
func (m *Photo) UpdateQuality() error {
	if m.DeletedAt != nil || m.PhotoQuality < 0 {
		return nil
	}

	m.PhotoQuality = m.QualityScore()

	return m.Update("PhotoQuality", m.PhotoQuality)
}
