package store

import "context"

func (db *DB) ListMessageTemplates(ctx context.Context, userID int64) ([]MessageTemplate, error) {
	rows, err := db.QueryContext(ctx, `
		SELECT id, user_id, name, body, is_default
		FROM message_templates WHERE user_id = ? ORDER BY is_default DESC, name`, userID)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var out []MessageTemplate
	for rows.Next() {
		var t MessageTemplate
		if err := rows.Scan(&t.ID, &t.UserID, &t.Name, &t.Body, &t.IsDefault); err != nil {
			return nil, err
		}
		out = append(out, t)
	}
	return out, rows.Err()
}

func (db *DB) GetMessageTemplate(ctx context.Context, userID, id int64) (*MessageTemplate, error) {
	row := db.QueryRowContext(ctx, `
		SELECT id, user_id, name, body, is_default
		FROM message_templates WHERE id = ? AND user_id = ?`, id, userID)
	var t MessageTemplate
	err := row.Scan(&t.ID, &t.UserID, &t.Name, &t.Body, &t.IsDefault)
	if err != nil {
		return nil, err
	}
	return &t, nil
}

func (db *DB) CreateMessageTemplate(ctx context.Context, userID int64, name, body string, isDefault bool) (int64, error) {
	if isDefault {
		_, _ = db.ExecContext(ctx, `UPDATE message_templates SET is_default = FALSE WHERE user_id = ?`, userID)
	}
	res, err := db.ExecContext(ctx, `
		INSERT INTO message_templates (user_id, name, body, is_default) VALUES (?, ?, ?, ?)`,
		userID, name, body, isDefault)
	if err != nil {
		return 0, err
	}
	return res.LastInsertId()
}

func (db *DB) UpdateMessageTemplate(ctx context.Context, userID, id int64, name, body string, isDefault bool) error {
	if isDefault {
		_, _ = db.ExecContext(ctx, `UPDATE message_templates SET is_default = FALSE WHERE user_id = ?`, userID)
	}
	_, err := db.ExecContext(ctx, `
		UPDATE message_templates SET name = ?, body = ?, is_default = ?
		WHERE id = ? AND user_id = ?`, name, body, isDefault, id, userID)
	return err
}

func (db *DB) DeleteMessageTemplate(ctx context.Context, userID, id int64) error {
	_, err := db.ExecContext(ctx, `
		DELETE FROM message_templates WHERE id = ? AND user_id = ?`, id, userID)
	return err
}

func (db *DB) GetDefaultTemplate(ctx context.Context, userID int64) (*MessageTemplate, error) {
	row := db.QueryRowContext(ctx, `
		SELECT id, user_id, name, body, is_default
		FROM message_templates WHERE user_id = ? AND is_default = TRUE LIMIT 1`, userID)
	var t MessageTemplate
	err := row.Scan(&t.ID, &t.UserID, &t.Name, &t.Body, &t.IsDefault)
	if err != nil {
		return nil, err
	}
	return &t, nil
}
