using Microsoft.Extensions.Logging;
using SameBeat.Application.DTO;
using SameBeat.Application.Interfejsy;
using SameBeat.Application.Komendy;
using SameBeat.Domain.Encje;
using SameBeat.Domain.Wyjatki;
namespace SameBeat.Application.Serwisy;
///
/// Minimalny cykl zycia wydarzenia dla hosta: utworz -> start -> stop. Sama scena/sloty to ETAP 3.
///
public sealed class SerwisZarzadzaniaWydarzeniem : ISerwisZarzadzaniaWydarzeniem
{
private readonly IRepozytoriumWydarzen _repozytoriumWydarzen;
private readonly IJednostkaPracy _jednostkaPracy;
private readonly ILogger _logger;
public SerwisZarzadzaniaWydarzeniem(
IRepozytoriumWydarzen repozytoriumWydarzen,
IJednostkaPracy jednostkaPracy,
ILogger logger)
{
_repozytoriumWydarzen = repozytoriumWydarzen;
_jednostkaPracy = jednostkaPracy;
_logger = logger;
}
public async Task> UtworzAsync(UtworzWydarzenieKomenda komenda, CancellationToken token = default)
{
Wydarzenie wydarzenie;
try
{
wydarzenie = Wydarzenie.Utworz(komenda.Nazwa);
}
catch (WyjatekDomenowy wyjatek)
{
return WynikOperacji.Niepowodzenie(wyjatek.Message);
}
_repozytoriumWydarzen.Dodaj(wydarzenie);
await _jednostkaPracy.ZapiszZmianyAsync(token);
_logger.LogInformation("Utworzono wydarzenie {WydarzenieId} ({Nazwa}).", wydarzenie.Id, wydarzenie.Nazwa);
return WynikOperacji.Ok(DoDto(wydarzenie));
}
public async Task> StartujAsync(Guid wydarzenieId, CancellationToken token = default)
{
var wydarzenie = await _repozytoriumWydarzen.ZnajdzPoIdAsync(wydarzenieId, token);
if (wydarzenie is null)
{
return WynikOperacji.Niepowodzenie("Nie znaleziono wydarzenia o podanym identyfikatorze.");
}
wydarzenie.PrzejdzNaLive();
await _jednostkaPracy.ZapiszZmianyAsync(token);
_logger.LogInformation("Wydarzenie {WydarzenieId} przeszlo na Live.", wydarzenie.Id);
return WynikOperacji.Ok(DoDto(wydarzenie));
}
public async Task> ZatrzymajAsync(Guid wydarzenieId, CancellationToken token = default)
{
var wydarzenie = await _repozytoriumWydarzen.ZnajdzPoIdAsync(wydarzenieId, token);
if (wydarzenie is null)
{
return WynikOperacji.Niepowodzenie("Nie znaleziono wydarzenia o podanym identyfikatorze.");
}
wydarzenie.PrzejdzNaOffline();
await _jednostkaPracy.ZapiszZmianyAsync(token);
_logger.LogInformation("Wydarzenie {WydarzenieId} przeszlo na Offline.", wydarzenie.Id);
return WynikOperacji.Ok(DoDto(wydarzenie));
}
private static WydarzenieDto DoDto(Wydarzenie wydarzenie) => new(wydarzenie.Id, wydarzenie.Nazwa, wydarzenie.Status);
}