﻿using System.Collections.Generic;
using Verse;
using RimWorld;
using UnityEngine;
using System.Windows;

namespace Rimworld_Animations {
    class MainTabWindow_OffsetConfigure : MainTabWindow
    {

        public override Vector2 RequestedTabSize => new Vector2(505, 500);
        public override void DoWindowContents(Rect inRect) {

            Rect position = new Rect(inRect.x, inRect.y, inRect.width, inRect.height);


            Listing_Standard listingStandard = new Listing_Standard();
            listingStandard.Begin(position);

            listingStandard.Label("RimAnims_AnimManager".Translate());

            listingStandard.GapLine();


            if (Find.Selector.SingleSelectedThing is Pawn curPawn
                && curPawn.TryGetComp<CompExtendedAnimator>(out CompExtendedAnimator extendedAnimator)
                && extendedAnimator.IsAnimating)
            {
                //Pawn info about their body, race
                Vector3 offsetPosition = extendedAnimator.Offset != null ? (Vector3)extendedAnimator.Offset : Vector3.zero;
                int offsetRotation = extendedAnimator.Rotation != null ? (int)extendedAnimator.Rotation : 0;

                string pawnDef = curPawn.def.defName;
                string bodyTypeDef = (curPawn.story?.bodyType != null) ? curPawn.story.bodyType.ToString() : "None";
                string genderDef = curPawn.gender.ToString();
                string currentAnimation = extendedAnimator.CurrentAnimation != null ? extendedAnimator.CurrentAnimation.defName : "None";

                listingStandard.Label(curPawn.Name + ": " + curPawn.def.defName + ", " + bodyTypeDef + ", " + genderDef + ",  Animation: " + currentAnimation);

                if (curPawn.def.defName == "Human")
                {
                    listingStandard.Label("RimAnims_Warning".Translate());
                }

                float posX = offsetPosition.x, posY = offsetPosition.y, posZ = offsetPosition.z;
                int rot = offsetRotation;

                float.TryParse(listingStandard.TextEntryLabeled("X: ", posX.ToString()), out posX);
                posX = listingStandard.Slider(posX, -2, 2);

                float.TryParse(listingStandard.TextEntryLabeled("Y: ", offsetPosition.y.ToString()), out posY);
                posY = listingStandard.Slider(posY, -2, 2);

                float.TryParse(listingStandard.TextEntryLabeled("Z: ", posZ.ToString()), out posZ);
                posZ = listingStandard.Slider(posZ, -2, 2);

                int.TryParse(listingStandard.TextEntryLabeled("Rotation: ", rot.ToString()), out rot);
                rot = (int)listingStandard.Slider(rot, -180, 180);

                listingStandard.GapLine();
                Vector3 newOffsetVector = new Vector3(posX, posY, posZ);

                string offset = "<li>";
                offset += bodyTypeDef != "None" ? "<bodyType>" + bodyTypeDef + "</bodyType>" : "";
                offset += newOffsetVector != Vector3.zero ? "<offset>(" + posX + ", " + posY + ", " + posZ + ")</offset>" : "";
                offset += rot != 0 ? "<rotation>" + rot + "</rotation>" : "";
                offset += "</li>";

                listingStandard.Label("Appropriate Offset value for " + currentAnimation + ", " + pawnDef + ", " + bodyTypeDef + ", " + genderDef + ": ");
                listingStandard.Label(offset);

                if (listingStandard.ButtonText("RimAnims_CopyToClipboard".Translate()))
                {

                    GUIUtility.systemCopyBuffer = offset;

                }

                listingStandard.Label("RimAnims_ShareSettings".Translate());

                extendedAnimator.Offset = newOffsetVector;
                extendedAnimator.Rotation = rot;

            }

            else
            {
                listingStandard.Label("Select a pawn currently in an animation to change their offsets");
            }

            listingStandard.End();

        }
    }
}

/**
 if (curPawn.TryGetComp<CompExtendedAnimator> animator) {



                    /*
        CompBodyAnimator compBodyAnimator = curPawn.TryGetComp<CompBodyAnimator>();
        AnimationDef def = compBodyAnimator.CurrentAnimation;
        int ActorIndex = compBodyAnimator.ActorIndex;
        float offsetX = 0, offsetZ = 0, rotation = 0;

        string bodyTypeDef = (curPawn.story?.bodyType != null) ? curPawn.story.bodyType.ToString() : "";

        if (AnimationSettings.offsets.ContainsKey(def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex)) {
            offsetX = AnimationSettings.offsets[def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex].x;
            offsetZ = AnimationSettings.offsets[def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex].y;
        } else {
            AnimationSettings.offsets.Add(def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex, new Vector2(0, 0));
        }

        if (AnimationSettings.rotation.ContainsKey(def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex)) {
            rotation = AnimationSettings.rotation[def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex];
        }
        else {
            AnimationSettings.rotation.Add(def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex, 0);
        }

        listingStandard.Label("Name: " + curPawn.Name + " Race: " + curPawn.def.defName + " Actor Index: " + curPawn.TryGetComp<CompBodyAnimator>().ActorIndex + " Body Type (if any): " + bodyTypeDef + " Animation: " + def.label + (curPawn.TryGetComp<CompBodyAnimator>().Mirror ? " mirrored" : ""));

        if(curPawn.def.defName == "Human") {
            listingStandard.Label("Warning--You generally don't want to change human offsets, only alien offsets");
        }

        float.TryParse(listingStandard.TextEntryLabeled("X Offset: ", offsetX.ToString()), out offsetX);
        offsetX = listingStandard.Slider(offsetX, -2, 2);

        float.TryParse(listingStandard.TextEntryLabeled("Z Offset: ", offsetZ.ToString()), out offsetZ);
        offsetZ = listingStandard.Slider(offsetZ, -2, 2);

        float.TryParse(listingStandard.TextEntryLabeled("Rotation: ", rotation.ToString()), out rotation);
        rotation = listingStandard.Slider(rotation, -180, 180);

        if(listingStandard.ButtonText("Reset All")) {
            offsetX = 0;
            offsetZ = 0;
            rotation = 0;
        }

        listingStandard.GapLine();

        if(listingStandard.ButtonText("Shift Actors")) {

            if(AnimationSettings.debugMode) {
                Log.Message("Shifting actors in animation...");
            }

            for(int i = 0; i < curPawn.TryGetComp<CompBodyAnimator>().actorsInCurrentAnimation.Count; i++) {

                Pawn actor = curPawn.TryGetComp<CompBodyAnimator>().actorsInCurrentAnimation[i];

                actor.TryGetComp<CompBodyAnimator>()?.shiftActorPositionAndRestartAnimation();

                //reset the clock time of every pawn in animation
                if(actor.jobs.curDriver is rjw.JobDriver_Sex) {
                    (actor.jobs.curDriver as rjw.JobDriver_Sex).ticks_left = def.animationTimeTicks;
                    (actor.jobs.curDriver as rjw.JobDriver_Sex).ticksLeftThisToil = def.animationTimeTicks;
                    (actor.jobs.curDriver as rjw.JobDriver_Sex).duration = def.animationTimeTicks;
                }

            }

        }

        if (offsetX != AnimationSettings.offsets[def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex].x || offsetZ != AnimationSettings.offsets[def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex].y) {
            AnimationSettings.offsets[def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex] = new Vector2(offsetX, offsetZ);

        }

        if(rotation != AnimationSettings.rotation[def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex]) {
            AnimationSettings.rotation[def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex] = rotation;
        }

    }

}
                    */


1.5/Source/MainTabWindows/MainTabWindow_OffsetConfigure.cs