using Contracts.BindingModels;
using Contracts.SearchModels;
using Contracts.StorageContracts;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DatabaseImplement.Implements
{
	public class RoleStorage : IRoleStorage
	{
		public RoleBindingModel? Delete(RoleSearchModel model)
		{
			if (model.Id is null)
			{
				return null;
			}

			var context = new Database();
			var role = context.Roles.FirstOrDefault(r => r.Id == model.Id);
			if (role is null)
			{
				return null;
			}

			context.Remove(role);
			context.SaveChanges();
			return role.GetBindingModel();
		}

		public RoleBindingModel? GetElement(RoleSearchModel model)
		{
			if (model.Id is null)
			{
				return null;
			}
			var context = new Database();
			return context.Roles
				.FirstOrDefault(r => r.Id == model.Id)
				?.GetBindingModel();
		}

		public IEnumerable<RoleBindingModel> GetList(RoleSearchModel? model)
		{
			var context = new Database();
			if (model is null)
			{
				return context.Roles.Select(r => r.GetBindingModel());
			}
			if (model.Id is null)
			{
				return [];
			}
			return context.Roles
				.Where(r => r.Id == model.Id)
				.Select(r => r.GetBindingModel());
		}

		public RoleBindingModel? Insert(RoleBindingModel model)
		{
			var context = new Database();
			var newRole = Models.Role.ToRoleFromBinding(model);

			context.Roles.Add(newRole);
			context.SaveChanges();

			return newRole.GetBindingModel();
		}

		public RoleBindingModel? Update(RoleBindingModel model)
		{
			var context = new Database();
			var role = context.Roles.FirstOrDefault(r => r.Id == model.Id);

			if (role is null)
			{
				return null;
			}

			role.Update(model);

			context.SaveChanges();
			return role.GetBindingModel();
		}
	}
}