using Forge.Core.Models;
using Microsoft.EntityFrameworkCore;

namespace Forge.Data.Services;

public class RepositoryService : IRepositoryService
{
    private readonly ForgeDbContext _db;

    public RepositoryService(ForgeDbContext db)
    {
        _db = db;
    }

    public async Task<IEnumerable<Repository>> GetAllAsync()
    {
        return await _db.Repositories
            .OrderBy(r => r.Owner)
            .ThenBy(r => r.Name)
            .ToListAsync();
    }

    public async Task<IEnumerable<Repository>> GetByOwnerAsync(string owner)
    {
        return await _db.Repositories
            .Where(r => r.Owner == owner)
            .OrderBy(r => r.Name)
            .ToListAsync();
    }

    public async Task<Repository?> GetByIdAsync(Guid id)
    {
        return await _db.Repositories.FindAsync(id);
    }

    public async Task<Repository?> GetByOwnerAndNameAsync(string owner, string name)
    {
        return await _db.Repositories
            .FirstOrDefaultAsync(r => r.Owner == owner && r.Name == name);
    }

    public async Task<Repository> CreateAsync(Repository repository)
    {
        repository.CreatedAt = DateTime.UtcNow;
        repository.UpdatedAt = DateTime.UtcNow;
        
        _db.Repositories.Add(repository);
        await _db.SaveChangesAsync();
        
        return repository;
    }

    public async Task<Repository> UpdateAsync(Repository repository)
    {
        repository.UpdatedAt = DateTime.UtcNow;
        _db.Repositories.Update(repository);
        await _db.SaveChangesAsync();
        
        return repository;
    }

    public async Task DeleteAsync(Guid id)
    {
        var repo = await _db.Repositories.FindAsync(id);
        if (repo != null)
        {
            _db.Repositories.Remove(repo);
            await _db.SaveChangesAsync();
        }
    }
}
An unhandled error has occurred. Reload 🗙