using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using gehGassi.Core.Interfaces;
using gehGassi.Domain.Advertisements;
using gehGassi.Domain.Common;
using Microsoft.EntityFrameworkCore;
namespace gehGassi.Core.Services
{
///
/// Service der die Verwaltung von Branchen realisiert
///
public class BranchService : ServiceBase, IBranchService
{
private readonly IRepository _namesRepository;
///
/// Erstellt eine Instanz
///
/// Instanz einer IUnitOfWork
public BranchService(IUnitOfWork unitOfWork) : base(unitOfWork)
{
_namesRepository = unitOfWork.GetRepository();
}
///
/// Gibt eine gefilterte Liste von Branchen zurück
///
/// Filterbegriff der in bestimmten Feldern gesucht wird
/// List betroffener Branchen
public IQueryable Filter(string filter)
{
return Repository.Query(c => c.Title.Contains(filter));
}
///
/// Erstellen einer Branche
///
/// Branche
public Branch Create()
{
var item = new Branch()
{
Id = Guid.NewGuid().ToString("N"),
Created = DateTimeOffset.UtcNow
};
return item;
}
///
/// Gibt eine gefilterte Liste von Branchen zurück.
///
/// Filterbegriff der in bestimmten Feldern gesucht wird
/// List betroffener Branchen
public async Task> SearchAsync(string filter)
{
return (await Repository.FindAsync(c => c.Title.Contains(filter))).ToList();
}
///
/// Gibt eine gefilterte Liste von Branchen mit Namen zurück in einer gewählten Sprache
///
/// Filterbegriff der in bestimmten Feldern gesucht wird
/// Gewünschte Sprache
/// Fallback Sprache
/// Sollen gelöschte inkludiert werden?
/// Liste betroffener Branchen
public IQueryable FilterWithNames(string filter, string language, string fallback, bool includeDeleted)
{
language = language.ToUpperInvariant();
fallback = fallback.ToUpperInvariant();
var baseQuery = _namesRepository.QueryStoredProcedure("SELECT * FROM tv_BranchesWithNames({0},{1})", c => c.Title.Contains(filter) || c.Name.Contains(filter), language, fallback);
if (!includeDeleted)
baseQuery = baseQuery.Where(c => c.Deleted == false);
return baseQuery;
}
///
/// Gibt eine gefilterte Liste von Branchen mit Namen zurück in einer gewählten Sprache welche für eine Listung aktiviert sind
///
/// Filterbegriff der in bestimmten Feldern gesucht wird
/// Gewünschte Sprache
/// Fallback Sprache
/// Sollen gelöschte inkludiert werden?
/// Liste betroffener Branchen
public IQueryable FilterWithNamesListings(string filter, string language, string fallback, bool includeDeleted)
{
language = language.ToUpperInvariant();
fallback = fallback.ToUpperInvariant();
var baseQuery = _namesRepository.QueryStoredProcedure("SELECT * FROM tv_BranchesWithNames({0},{1})", c => c.ListingAllowed && (c.Title.Contains(filter) || c.Name.Contains(filter)), language, fallback);
if (!includeDeleted)
baseQuery = baseQuery.Where(c => c.Deleted == false);
return baseQuery;
}
///
/// Gibt eine Liste von Branchen in einer gewählten Sprache zurück, welche online sind
///
/// Gewünschte Sprache
/// Fallback Sprache
/// Liste von Branchen
public async Task> GetOnlineAsync(string language, string fallback)
{
language = language.ToUpperInvariant();
fallback = fallback.ToUpperInvariant();
var baseQuery = _namesRepository.QueryStoredProcedure("SELECT * FROM tv_BranchesWithNames({0},{1})", c => c.ListingAllowed && c.OnlineStatus == OnlineStatus.Online && c.Deleted == false, language, fallback);
return await baseQuery.OrderBy(c => c.Order).ToListAsync().ConfigureAwait(false);
}
}
}