package sqlite

import (
	"context"
	"database/sql"
	"fmt"
)

// GetExportHash retrieves the content hash of the last export for an issue.
// Returns empty string if no hash is stored (first export).
func (s *SQLiteStorage) GetExportHash(ctx context.Context, issueID string) (string, error) {
	var hash string
	err := s.db.QueryRowContext(ctx, `
		SELECT content_hash FROM export_hashes WHERE issue_id = ?
	`, issueID).Scan(&hash)
	
	if err == sql.ErrNoRows {
		return "", nil // No hash stored yet
	}
	if err != nil {
		return "", fmt.Errorf("failed to get export hash for %s: %w", issueID, err)
	}
	
	return hash, nil
}

// SetExportHash stores the content hash of an issue after successful export.
func (s *SQLiteStorage) SetExportHash(ctx context.Context, issueID, contentHash string) error {
	_, err := s.db.ExecContext(ctx, `
		INSERT INTO export_hashes (issue_id, content_hash, exported_at)
		VALUES (?, ?, CURRENT_TIMESTAMP)
		ON CONFLICT(issue_id) DO UPDATE SET
			content_hash = excluded.content_hash,
			exported_at = CURRENT_TIMESTAMP
	`, issueID, contentHash)
	
	if err != nil {
		return fmt.Errorf("failed to set export hash for %s: %w", issueID, err)
	}
	
	return nil
}

// ClearAllExportHashes removes all export hashes from the database.
// This is primarily used for test isolation to force re-export of issues.
func (s *SQLiteStorage) ClearAllExportHashes(ctx context.Context) error {
	_, err := s.db.ExecContext(ctx, `DELETE FROM export_hashes`)
	if err != nil {
		return fmt.Errorf("failed to clear export hashes: %w", err)
	}
	return nil
}

// GetJSONLFileHash retrieves the stored hash of the JSONL file.
// Returns empty string if no hash is stored (bd-160).
func (s *SQLiteStorage) GetJSONLFileHash(ctx context.Context) (string, error) {
	var hash string
	err := s.db.QueryRowContext(ctx, `
		SELECT value FROM metadata WHERE key = 'jsonl_file_hash'
	`).Scan(&hash)
	
	if err == sql.ErrNoRows {
		return "", nil // No hash stored yet
	}
	if err != nil {
		return "", fmt.Errorf("failed to get jsonl_file_hash: %w", err)
	}
	
	return hash, nil
}

// SetJSONLFileHash stores the hash of the JSONL file after export (bd-160).
func (s *SQLiteStorage) SetJSONLFileHash(ctx context.Context, fileHash string) error {
	_, err := s.db.ExecContext(ctx, `
		INSERT INTO metadata (key, value)
		VALUES ('jsonl_file_hash', ?)
		ON CONFLICT(key) DO UPDATE SET value = excluded.value
	`, fileHash)
	
	if err != nil {
		return fmt.Errorf("failed to set jsonl_file_hash: %w", err)
	}
	
	return nil
}
