using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GTANetworkAPI;
using ReallifeGamemode.Server.Business;
using ReallifeGamemode.Server.Entities;
using ReallifeGamemode.Server.Entities.Logs;
using ReallifeGamemode.Server.Extensions;
using ReallifeGamemode.Server.Models;
using ReallifeGamemode.Server.Util;

/**
* @overview Life of German Reallife - Managers BankManager (BankManager.cs)
* @author VegaZ
* @copyright (c) 2008 - 2018 Life of German
*/

namespace ReallifeGamemode.Server.Managers
{
    public class BankManager
    {
        public static TransactionResult SetMoney(Client admin, IBankAccountOwner owner, int amount, string reason = "Von Admin gesetzt")
        {
            using (var transferMoney = new DatabaseContext())
            {
                if (amount < 0) return TransactionResult.NEGATIVE_MONEY_SENT;

                IBankAccount account = owner.GetBankAccount(transferMoney);

                if (account == null) return TransactionResult.RECEIVER_NO_BANKACCOUNT;

                var transactionLog = new BankAccountTransactionHistory
                {
                    Sender = "ADMIN: " + admin.Name,
                    SenderBalance = 0,
                    Receiver = owner.Name,
                    ReceiverBalance = amount,
                    NewReceiverBalance = amount,
                    NewSenderBalance = 0,
                    MoneySent = amount,
                    Fee = 0,
                    Origin = reason
                };

                // add log
                transferMoney.BankAccountTransactionLogs.Add(transactionLog);

                account.Balance = amount;

                transferMoney.SaveChanges();

                return TransactionResult.SUCCESS;
            }
        }

        public static TransactionResult TransferMoney(IBankAccountOwner sender, IBankAccountOwner receiver, int amount, string origin)
        {
            using (var transferMoney = new DatabaseContext())
            {
                if (amount < 0) return TransactionResult.NEGATIVE_MONEY_SENT;

                IBankAccount senderAccount = sender.GetBankAccount(transferMoney);
                IBankAccount receiverAccount = receiver.GetBankAccount(transferMoney);

                if (senderAccount == null) return TransactionResult.SENDER_NO_BANKACCOUNT;
                if (receiverAccount == null) return TransactionResult.RECEIVER_NO_BANKACCOUNT;

                if (senderAccount.Balance < amount) return TransactionResult.SENDER_NOT_ENOUGH_MONEY;

                var transactionLog = new BankAccountTransactionHistory
                {
                    Sender = sender.Name,
                    SenderBalance = senderAccount.Balance,
                    Receiver = receiver.Name,
                    ReceiverBalance = receiverAccount.Balance,
                    NewReceiverBalance = receiverAccount.Balance + amount,
                    NewSenderBalance = senderAccount.Balance - amount,
                    MoneySent = amount,
                    Fee = 0,
                    Origin = origin
                };

                // add log
                transferMoney.BankAccountTransactionLogs.Add(transactionLog);

                senderAccount.Balance -= amount;
                receiverAccount.Balance += amount;

                transferMoney.SaveChanges();

                return TransactionResult.SUCCESS;
            }
        }
    }
}
