/*
Copyright(c) 2021 0ceal0t (https://github.com/0ceal0t/JobBars)
Modifications Copyright(c) 2021 HSUI
08/29/2021 - Extracted code to get the GCD state of player actions.

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

using FFXIVClientStructs.FFXIV.Client.Game;
using System.Collections.Generic;
using Dalamud.Game.ClientState.Objects.SubKinds;

namespace HSUI.Helpers
{
    internal static class GCDHelper
    {
        private static readonly Dictionary<uint, uint> JobActionIDs = new()
        {
            [JobIDs.GNB] = 16137, // Keen Edge
            [JobIDs.WAR] = 31,    // Heavy Swing
            [JobIDs.MRD] = 31,    // Heavy Swing
            [JobIDs.DRK] = 3617,  // Hard Slash
            [JobIDs.PLD] = 9,     // Fast Blade
            [JobIDs.GLA] = 9,     // Fast Blade

            [JobIDs.SCH] = 163,   // Ruin
            [JobIDs.AST] = 3596,  // Malefic
            [JobIDs.WHM] = 119,   // Stone
            [JobIDs.CNJ] = 119,   // Stone
            [JobIDs.SGE] = 24283, // Dosis

            [JobIDs.BRD] = 97,    // Heavy Shot
            [JobIDs.ARC] = 97,    // Heavy Shot
            [JobIDs.DNC] = 15989, // Cascade
            [JobIDs.MCH] = 2866,  // Split Shot

            [JobIDs.SMN] = 163,   // Ruin
            [JobIDs.ACN] = 163,   // Ruin
            [JobIDs.RDM] = 7504,  // Riposte
            [JobIDs.BLM] = 142,   // Blizzard
            [JobIDs.THM] = 142,   // Blizzard
            [JobIDs.PCT] = 34650, // Fire in Red

            [JobIDs.SAM] = 7477,  // Hakaze
            [JobIDs.NIN] = 2240,  // Spinning Edge
            [JobIDs.ROG] = 2240,  // Spinning Edge
            [JobIDs.MNK] = 53,    // Bootshine
            [JobIDs.PGL] = 53,    // Bootshine
            [JobIDs.DRG] = 75,    // True Thrust
            [JobIDs.LNC] = 75,    // True Thrust
            [JobIDs.RPR] = 24373, // Slice
            [JobIDs.VPR] = 34606, // Steel Fangs

            [JobIDs.BLU] = 11385  // Water Cannon
        };

        public static unsafe bool GetGCDInfo(IPlayerCharacter player, out float timeElapsed, out float timeTotal, ActionType actionType = ActionType.Action)
        {
            if (player is null || !JobActionIDs.TryGetValue(player.ClassJob.RowId, out var actionId))
            {
                timeElapsed = 0;
                timeTotal = 0;

                return false;
            }

            var actionManager = ActionManager.Instance();
            var adjustedId = actionManager->GetAdjustedActionId(actionId);
            timeElapsed = actionManager->GetRecastTimeElapsed(actionType, adjustedId);
            timeTotal = actionManager->GetRecastTime(actionType, adjustedId);

            return timeElapsed > 0;
        }
    }
}
