using GTANetworkAPI;
using ReallifeGamemode.Server.Entities;
using ReallifeGamemode.Server.Extensions;
using ReallifeGamemode.Server.Models;
using ReallifeGamemode.Server.Util;
using System.Linq;

namespace ReallifeGamemode.Server.Business
{
    public abstract class BusinessBase : IBankAccountOwner
    {
        private TextLabel _informationLabel;
        private ColShape _colShape;

        public abstract int Id { get; }
        public abstract string Name { get; }

        public abstract Vector3 Position { get; }

        public IBankAccount GetBankAccount(DatabaseContext databaseContext = null)
        {
            if (databaseContext == null)
            {
                using (databaseContext = new DatabaseContext())
                {
                    return databaseContext.BusinessBankAccounts.FirstOrDefault(u => u.BusinessId == Id);
                }
            }
            else
            {
                return databaseContext.BusinessBankAccounts.FirstOrDefault(u => u.BusinessId == Id);
            }
        }

        public void Setup()
        {
            _informationLabel = NAPI.TextLabel.CreateTextLabel(Name, Position.Add(new Vector3(0, 0, 0.5)), 20.0f, 1.3f, 0, new Color(255, 255, 255));
            NAPI.Marker.CreateMarker(MarkerType.VerticalCylinder, Position.Subtract(new Vector3(0, 0, 1.5)), new Vector3(), new Vector3(), 1f, new Color(255, 255, 255));

            _colShape = NAPI.ColShape.CreateSphereColShape(Position.Subtract(new Vector3(0, 0, 1.5)), 3f);
            _colShape.OnEntityEnterColShape += EntityEnterBusinessColShape;
            _colShape.OnEntityExitColShape += EntityExitBusinessColShape;

            if (GetBankAccount() == null)
            {
                NAPI.Util.ConsoleOutput("Creating Bank Account for Business: " + Name);
                using (var dbContext = new DatabaseContext())
                {

                    dbContext.BusinessBankAccounts.Add(new BusinessBankAccount()
                    {
                        BusinessId = Id,
                        Balance = 0
                    });
                    dbContext.SaveChanges();
                }
            }
        }

        private void EntityExitBusinessColShape(ColShape colShape, Client client)
        {
            client.TriggerEvent("business_removeHelp", true);
        }

        private void EntityEnterBusinessColShape(ColShape colShape, Client client)
        {
            if (GetOwner() != null && GetOwner().Id == client.GetUser()?.Id && !client.IsInVehicle)
            {
                client.TriggerEvent("business_showHelp", Name, (GetBankAccount()?.Balance ?? 0).ToMoneyString());
            }
        }

        public void Update(int? money = null)
        {
            if (money == null) money = GetBankAccount()?.Balance ?? 0;
            User owner = GetOwner();
            string infoText = Name + "\n" + "Besitzer: " + (owner == null ? "Niemand" : owner.Name) + "\nKasse: ~g~" + money.ToMoneyString();
            _informationLabel.Text = infoText;
        }

        public User GetOwner(DatabaseContext dbContext = null)
        {
            if (dbContext == null)
            {
                using (dbContext = new DatabaseContext())
                {
                    return dbContext.Users.FirstOrDefault(u => u.BusinessId == Id);
                }
            }
            else
            {
                return dbContext.Users.FirstOrDefault(u => u.BusinessId == Id);
            }
        }

        public abstract void Load();
    }
}
