"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.GeneralSearchService = void 0;
const UserMapper_1 = require("../DTOs/Mappers/UserMapper");
const OrganizationMapper_1 = require("../DTOs/Mappers/OrganizationMapper");
const DeckMapper_1 = require("../DTOs/Mappers/DeckMapper");
class GeneralSearchService {
    constructor(userRepo, organizationRepo, deckRepo) {
        this.userRepo = userRepo;
        this.organizationRepo = organizationRepo;
        this.deckRepo = deckRepo;
    }
    static getSearchTypeFromUrl(url) {
        if (url.includes('/users/') || url.includes('/api/users/')) {
            return 'users';
        }
        else if (url.includes('/organizations/') || url.includes('/api/organizations/')) {
            return 'organizations';
        }
        else if (url.includes('/decks/') || url.includes('/api/decks/')) {
            return 'decks';
        }
        return 'users';
    }
    async searchUsers(searchQuery) {
        const { query, limit = 20, offset = 0 } = searchQuery;
        if (!query || query.trim().length === 0) {
            return {
                results: [],
                totalCount: 0,
                hasMore: false,
                searchQuery: query,
                searchType: 'users'
            };
        }
        try {
            const { users, totalCount } = await this.userRepo.search(query.trim(), limit, offset);
            const results = users.map(user => UserMapper_1.UserMapper.toShortDto(user));
            const hasMore = (offset + limit) < totalCount;
            return {
                results,
                totalCount,
                hasMore,
                searchQuery: query,
                searchType: 'users'
            };
        }
        catch (error) {
            throw new Error('Failed to search users');
        }
    }
    async searchOrganizations(searchQuery) {
        const { query, limit = 20, offset = 0 } = searchQuery;
        if (!query || query.trim().length === 0) {
            return {
                results: [],
                totalCount: 0,
                hasMore: false,
                searchQuery: query,
                searchType: 'organizations'
            };
        }
        const { organizations, totalCount } = await this.organizationRepo.search(query.trim(), limit, offset);
        const results = organizations.map(org => OrganizationMapper_1.OrganizationMapper.toShortDto(org));
        const hasMore = (offset + limit) < totalCount;
        return {
            results,
            totalCount,
            hasMore,
            searchQuery: query,
            searchType: 'organizations'
        };
    }
    async searchDecks(searchQuery) {
        const { query, limit = 20, offset = 0 } = searchQuery;
        if (!query || query.trim().length === 0) {
            return {
                results: [],
                totalCount: 0,
                hasMore: false,
                searchQuery: query,
                searchType: 'decks'
            };
        }
        const { decks, totalCount } = await this.deckRepo.search(query.trim(), limit, offset);
        const results = decks.map(deck => DeckMapper_1.DeckMapper.toShortDto(deck));
        const hasMore = (offset + limit) < totalCount;
        return {
            results,
            totalCount,
            hasMore,
            searchQuery: query,
            searchType: 'decks'
        };
    }
    async searchByType(searchType, searchQuery) {
        switch (searchType) {
            case 'users':
                return await this.searchUsers(searchQuery);
            case 'organizations':
                return await this.searchOrganizations(searchQuery);
            case 'decks':
                return await this.searchDecks(searchQuery);
            default:
                throw new Error(`Unsupported search type: ${searchType}`);
        }
    }
    async searchFromUrl(url, searchQuery) {
        const searchType = GeneralSearchService.getSearchTypeFromUrl(url);
        return await this.searchByType(searchType, searchQuery);
    }
}
exports.GeneralSearchService = GeneralSearchService;
//# sourceMappingURL=Generalsearch.js.map