﻿using PostSharp.Patterns.Caching;
using System;
using System.Collections.Generic;
using System.Threading;

namespace PostSharp.Samples.Caching
{
  [CacheConfiguration(ProfileName = "Account")] // See Program.cs for the configuration of the "Account" caching profile.
  internal class AccountServices
  {
    [Cache]
    public static Account GetAccount(int id)
    {
      Console.WriteLine($">> Retrieving the account {id} from database...");
      Thread.Sleep(1000);

      var account = new Account { AccountId = id };

      CachingServices.CurrentContext.AddDependency(account);

      return account;
    }

    [Cache]
    public static IEnumerable<Account> GetAccountsOfCustomer(int customerId)
    {
      // Dependencies of GetAccount are automatically added to GetAccountsOfCustomer.
      yield return GetAccount(1);
      yield return GetAccount(2);
    }

    public static void UpdateAccount(Account account)
    {
      Console.WriteLine($">> Updating the account {account.AccountId} in database...");
      Thread.Sleep(1000);

      // This will invalidate both GetAccount and GetAccountsOfCustomer.
      CachingServices.Invalidation.Invalidate(account);
    }
  }
}