package api

import (
	"context"
	"database/sql"
	"fmt"
	"strings"
)

func (s *Server) insertNotification(ctx context.Context, userID uint64, title, body string) error {
	title = strings.TrimSpace(title)
	if title == "" {
		title = "Notifikasi"
	}
	body = strings.TrimSpace(body)
	var bodyArg interface{}
	if body != "" {
		bodyArg = body
	}
	_, err := s.DB.ExecContext(ctx,
		`INSERT INTO notifications (user_id, title, body) VALUES ($1, $2, $3)`,
		userID, title, bodyArg,
	)
	return err
}

// notifyOnReportSubmitted creates inbox rows for the reporter and active superadmins.
func (s *Server) notifyOnReportSubmitted(ctx context.Context, reportID, ownerUserID uint64) error {
	var reportTitle, division, reporterName string
	var reportDate sql.NullString
	err := s.DB.QueryRowContext(ctx, `
		SELECT r.title, COALESCE(r.division, ''), r.report_date::text, COALESCE(NULLIF(TRIM(u.name), ''), u.email)
		FROM reports r
		INNER JOIN users u ON u.id = r.user_id
		WHERE r.id = $1`,
		reportID,
	).Scan(&reportTitle, &division, &reportDate, &reporterName)
	if err != nil {
		return err
	}

	divLabel := strings.TrimSpace(division)
	if divLabel == "" {
		divLabel = "—"
	}
	dateLabel := strings.TrimSpace(reportDate.String)
	titleLabel := strings.TrimSpace(reportTitle)
	if titleLabel == "" {
		titleLabel = "Laporan harian"
	}

	ownerBody := fmt.Sprintf("Laporan Anda «%s» (divisi %s) berhasil dikirim.", titleLabel, divLabel)
	if dateLabel != "" {
		ownerBody = fmt.Sprintf("Laporan Anda «%s» (%s · divisi %s) berhasil dikirim.", titleLabel, dateLabel, divLabel)
	}
	if err := s.insertNotification(ctx, ownerUserID, "Laporan harian terkirim", ownerBody); err != nil {
		return err
	}

	adminTitle := "Laporan baru masuk"
	adminBody := fmt.Sprintf("%s mengirim laporan: %s · divisi %s", reporterName, titleLabel, divLabel)
	if dateLabel != "" {
		adminBody = fmt.Sprintf("%s mengirim laporan (%s): %s · divisi %s", reporterName, dateLabel, titleLabel, divLabel)
	}

	rows, err := s.DB.QueryContext(ctx, `SELECT id FROM users WHERE role = 'superadmin' AND is_active = true`)
	if err != nil {
		return err
	}
	defer rows.Close()
	for rows.Next() {
		var adminID uint64
		if err := rows.Scan(&adminID); err != nil {
			return err
		}
		if adminID == ownerUserID {
			continue
		}
		if err := s.insertNotification(ctx, adminID, adminTitle, adminBody); err != nil {
			return err
		}
	}
	return rows.Err()
}

func reportStatusSubmitted(status string) bool {
	return strings.ToLower(strings.TrimSpace(status)) == "submitted"
}

// notifyOnChatMentions creates inbox rows for users tagged in a workspace message.
func (s *Server) notifyOnChatMentions(ctx context.Context, senderID uint64, senderName, body string, mentionIDs []uint64) error {
	if len(mentionIDs) == 0 {
		return nil
	}
	senderName = strings.TrimSpace(senderName)
	if senderName == "" {
		senderName = "Seseorang"
	}
	preview := strings.TrimSpace(body)
	if len(preview) > 200 {
		preview = preview[:197] + "…"
	}
	title := "Anda disebut di Chat"
	notifBody := fmt.Sprintf("%s menyebut Anda: %s", senderName, preview)

	for _, targetID := range mentionIDs {
		if targetID == senderID {
			continue
		}
		if err := s.insertNotification(ctx, targetID, title, notifBody); err != nil {
			return err
		}
	}
	return nil
}
