using Core.Annotations;
using Core.Models.Eft.Common;
using Core.Models.Eft.Common.Tables;
using Core.Models.Spt.Services;

namespace Core.Services;

[Injectable(InjectionType.Singleton)]
public class InsuranceService
{
    /// <summary>
    /// Does player have insurance dictionary exists
    /// </summary>
    /// <param name="sessionId">Player id</param>
    /// <returns>True if exists</returns>
    public bool InsuranceDictionaryExists(string sessionId)
    {
        throw new NotImplementedException();
    }

    /// <summary>
    /// Get all insured items by all traders for a profile
    /// </summary>
    /// <param name="sessionId">Profile id (session id)</param>
    /// <returns>Item list</returns>
    public Dictionary<string, List<Item>> GetInsurance(string sessionId)
    {
        throw new NotImplementedException();
    }

    public void ResetInsurance(string sessionId)
    {
        throw new NotImplementedException();
    }

    /// <summary>
    /// Sends 'I will go look for your stuff' trader message +
    /// Store lost insurance items inside profile for later retrieval
    /// </summary>
    /// <param name="pmcData">Profile to send insured items to</param>
    /// <param name="sessionID">SessionId of current player</param>
    /// <param name="mapId">Id of the location player died/exited that caused the insurance to be issued on</param>
    public void StartPostRaidInsuranceLostProcess(PmcData pmcData, string sessionID, string mapId)
    {
        throw new NotImplementedException();
    }

    /// <summary>
    /// Get a timestamp of when insurance items should be sent to player based on trader used to insure
    /// Apply insurance return bonus if found in profile
    /// </summary>
    /// <param name="pmcData">Player profile</param>
    /// <param name="trader">Trader base used to insure items</param>
    /// <returns>Timestamp to return items to player in seconds</returns>
    protected double GetInsuranceReturnTimestamp(PmcData pmcData, TraderBase trader)
    {
        throw new NotImplementedException();
    }

    protected double GetMaxInsuranceStorageTime(TraderBase traderBase)
    {
        throw new NotImplementedException();
    }

    /// <summary>
    /// Store lost gear post-raid inside profile, ready for later code to pick it up and mail it
    /// </summary>
    /// <param name="equipmentPkg">Gear to store - generated by GetGearLostInRaid()</param>
    public void StoreGearLostInRaidToSendLater(string sessionID, List<InsuranceEquipmentPkg> equipmentPkg)
    {
        throw new NotImplementedException();
    }

    /// <summary>
    /// For the passed in items, find the trader it was insured against
    /// </summary>
    /// <param name="sessionId">Session id</param>
    /// <param name="lostInsuredItems">Insured items lost in a raid</param>
    /// <param name="pmcProfile">Player profile</param>
    /// <returns>InsuranceEquipmentPkg list</returns>
    public List<InsuranceEquipmentPkg> MapInsuredItemsToTrader(
        string sessionId,
        List<Item> lostInsuredItems,
        PmcData pmcProfile)
    {
        throw new NotImplementedException();
    }

    /// <summary>
    /// Some items should never be returned in insurance but BSG send them in the request
    /// </summary>
    /// <param name="lostItem">Item being returned in insurance</param>
    /// <param name="inventoryItems">Player inventory</param>
    /// <returns>True if item</returns>
    protected bool ItemCannotBeLostOnDeath(Item lostItem, List<Item> inventoryItems)
    {
        throw new NotImplementedException();
    }

    /// <summary>
    /// Add gear item to InsuredItems list in player profile
    /// </summary>
    /// <param name="gear">Gear to send</param>
    protected void AddGearToSend(InsuranceEquipmentPkg gear)
    {
        throw new NotImplementedException();
    }

    /// <summary>
    /// Does insurance exist for a player and by trader
    /// </summary>
    /// <param name="sessionId">Player id (session id)</param>
    /// <param name="traderId">Trader items insured with</param>
    /// <returns>True if exists</returns>
    protected bool InsuranceTraderArrayExists(string sessionId, string traderId)
    {
        throw new NotImplementedException();
    }

    /// <summary>
    /// Empty out list holding insured items by sessionid + traderid
    /// </summary>
    /// <param name="sessionId">Player id (session id)</param>
    /// <param name="traderId">Trader items insured with</param>
    public void ResetInsuranceTraderArray(string sessionId, string traderId)
    {
        throw new NotImplementedException();
    }

    /// <summary>
    /// Store insured item
    /// </summary>
    /// <param name="sessionId">Player id (session id)</param>
    /// <param name="traderId">Trader item insured with</param>
    /// <param name="itemToAdd">Insured item (with children)</param>
    public void AddInsuranceItemToArray(string sessionId, string traderId, Item itemToAdd)
    {
        throw new NotImplementedException();
    }

    /// <summary>
    /// Get price of insurance * multiplier from config
    /// </summary>
    /// <param name="pmcData">Player profile</param>
    /// <param name="inventoryItem">Item to be insured</param>
    /// <param name="traderId">Trader item is insured with</param>
    /// <returns>price in roubles</returns>
    public double GetRoublePriceToInsureItemWithTrader(PmcData pmcData, Item inventoryItem, string traderId)
    {
        throw new NotImplementedException();
    }
}
