using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using AX.InputSystem;
using System;

public class Cloneable : GameObjectCloneable
{
    //克隆地点需要限制的克隆类型
    private List<CloneObjType> CloneableTypes = new List<CloneObjType>();

    private void Start()
    {
        CloneableTypes.Add(CloneObjType.stagingArea);
        CloneableTypes.Add(CloneObjType.securityInspector);
        CloneableTypes.Add(CloneObjType.searchSign);
        CloneableTypes.Add(CloneObjType.sixLadder);

        CloneableTypes.Add(CloneObjType.fifteenLadder);
        CloneableTypes.Add(CloneObjType.headquarters);
        CloneableTypes.Add(CloneObjType.fireNormal);
        CloneableTypes.Add(CloneObjType.fireIndoor);

        CloneableTypes.Add(CloneObjType.fireBreakThrough);
        CloneableTypes.Add(CloneObjType.sundriesHeap);
        CloneableTypes.Add(CloneObjType.dangerousGoods);
        CloneableTypes.Add(CloneObjType.forcibleEntryPoint);

        CloneableTypes.Add(CloneObjType.rollingDoor);
        CloneableTypes.Add(CloneObjType.wounded);
        CloneableTypes.Add(CloneObjType.trappedPerson);
        CloneableTypes.Add(CloneObjType.insider);

        CloneableTypes.Add(CloneObjType.smokeNormal);
        CloneableTypes.Add(CloneObjType.smokeIndoor1);
        CloneableTypes.Add(CloneObjType.smokeIndoor2);
        CloneableTypes.Add(CloneObjType.fireman);

        CloneableTypes.Add(CloneObjType.WarningLine);
        CloneableTypes.Add(CloneObjType.AttackLine);
        CloneableTypes.Add(CloneObjType.RetreatLine);
        CloneableTypes.Add(CloneObjType.OrdinaryHose);

        CloneableTypes.Add(CloneObjType.BrokenLine);
        CloneableTypes.Add(CloneObjType.BlockLine);
        CloneableTypes.Add(CloneObjType.EjectSmokeLine);
        CloneableTypes.Add(CloneObjType.ScintillationHose);

        CloneableTypes.Add(CloneObjType.WaterTanker);
        CloneableTypes.Add(CloneObjType.FoamTruck);
        CloneableTypes.Add(CloneObjType.DryPowderTruck);
        CloneableTypes.Add(CloneObjType.AerialTowerTruck);
        CloneableTypes.Add(CloneObjType.HighSprayingTruck);
        CloneableTypes.Add(CloneObjType.LadderTruck);
        CloneableTypes.Add(CloneObjType.SmokeExhaustTruck);
        CloneableTypes.Add(CloneObjType.RescueVehicle);
        CloneableTypes.Add(CloneObjType.Apparatus);
        CloneableTypes.Add(CloneObjType.LightingAppliance);
        CloneableTypes.Add(CloneObjType.DecontaminationTruck);
        CloneableTypes.Add(CloneObjType.LDWSVehicle);
        CloneableTypes.Add(CloneObjType.AirSupplyTruck);
        CloneableTypes.Add(CloneObjType.RepairCar);
        CloneableTypes.Add(CloneObjType.RefuelCar);
        CloneableTypes.Add(CloneObjType.TroopCrawler);
        CloneableTypes.Add(CloneObjType.SupportVehicle);
        CloneableTypes.Add(CloneObjType.VortexCar);
        CloneableTypes.Add(CloneObjType.CARescueVehicle);
        CloneableTypes.Add(CloneObjType.ForcibleEntryTruck);
        CloneableTypes.Add(CloneObjType.EquipRescueVehicle);
        CloneableTypes.Add(CloneObjType.FoamDryPowderCompanyCar);
        CloneableTypes.Add(CloneObjType.FoodSafetyCar);
        CloneableTypes.Add(CloneObjType.CCCar);
        CloneableTypes.Add(CloneObjType.UHWSVehicle);
        CloneableTypes.Add(CloneObjType.ABICar);
        CloneableTypes.Add(CloneObjType.ambulance);
        CloneableTypes.Add(CloneObjType.PoliceCar);
        CloneableTypes.Add(CloneObjType.PowerRepairVehicles);
        CloneableTypes.Add(CloneObjType.GasEmergencyCar);
        CloneableTypes.Add(CloneObjType.WaterSupplyRepairCar);

        CloneableTypes.Add(CloneObjType.ObserveInspector);
        CloneableTypes.Add(CloneObjType.SimulationEvacuate);
        CloneableTypes.Add(CloneObjType.ObligationFireman);

        CloneableTypes.Add(CloneObjType.SeparateWater);
        CloneableTypes.Add(CloneObjType.HandPump);
        CloneableTypes.Add(CloneObjType.WaterCannon);
        CloneableTypes.Add(CloneObjType.SignalPagoda);

        CloneableTypes.Add(CloneObjType.LiquidLevel);
        CloneableTypes.Add(CloneObjType.Leak1);
        CloneableTypes.Add(CloneObjType.Leak2);
        CloneableTypes.Add(CloneObjType.Explode);
        CloneableTypes.Add(CloneObjType.ShapeChange);
        CloneableTypes.Add(CloneObjType.Splash);
        CloneableTypes.Add(CloneObjType.BoilOver);
        CloneableTypes.Add(CloneObjType.FireSpreadLine);
        CloneableTypes.Add(CloneObjType.SpreadedFire);

        //作战部署克隆类型
        CloneableTypes.Add(CloneObjType.Text);
        CloneableTypes.Add(CloneObjType.Rect);
        CloneableTypes.Add(CloneObjType.Arrow);

        CloneableTypes.Add(CloneObjType.CutOff);
        CloneableTypes.Add(CloneObjType.BreakThrough);
        CloneableTypes.Add(CloneObjType.Segment);
        CloneableTypes.Add(CloneObjType.Suppress);
        CloneableTypes.Add(CloneObjType.PincerAttack);
        CloneableTypes.Add(CloneObjType.JointAttack);

        CloneableTypes.Add(CloneObjType.DirectWaterSupply);
        CloneableTypes.Add(CloneObjType.RelayWaterSupply);
        CloneableTypes.Add(CloneObjType.CouplingWaterSupply);
        CloneableTypes.Add(CloneObjType.WaterLineWaterSupply);
        CloneableTypes.Add(CloneObjType.SuctionFeedWaterSupply);
        CloneableTypes.Add(CloneObjType.HandPumpWaterSupply);
        CloneableTypes.Add(CloneObjType.FloatingFirePumpWaterSupply);

        CloneableTypes.Add(CloneObjType.FDWaterTanker);
        CloneableTypes.Add(CloneObjType.FDFoamTruck);
        CloneableTypes.Add(CloneObjType.FDAerialTowerTruck);
        CloneableTypes.Add(CloneObjType.FDHighSprayingTruck);
        CloneableTypes.Add(CloneObjType.FDLadderTruck);
        CloneableTypes.Add(CloneObjType.FDSmokeExhaustTruck);
        CloneableTypes.Add(CloneObjType.FDRescueVehicle);
        CloneableTypes.Add(CloneObjType.FDApparatus);
        CloneableTypes.Add(CloneObjType.FDLightingAppliance);
        CloneableTypes.Add(CloneObjType.FDAirSupplyTruck);
        CloneableTypes.Add(CloneObjType.FDForcibleEntryTruck);
        CloneableTypes.Add(CloneObjType.FDFireMan);

        //指挥官角色克隆也受限制
        CloneableTypes.Add(CloneObjType.Character);

        CloneableTypes.Add(CloneObjType.FirefightingRobot);
        CloneableTypes.Add(CloneObjType.SnowCannon);
        CloneableTypes.Add(CloneObjType.WaterCurtainHose);
    }

    public override bool GetCloneAble(Vector3 hitPoint, GameObject hitObj, CloneObjType cloneObjType)
    {
        bool cloneable = false;
        //如果是受克隆地点限制需要判断能否在该地点克隆
        if (CloneableTypes.Contains(cloneObjType))
        {
            var cloneableEnums = hitObj.GetComponent<CloneableEnums>();
            
            if (cloneableEnums && cloneableEnums.CloneableTypes.Contains(cloneObjType))
            {
                CheckCloneable(hitPoint, hitObj, cloneObjType, ref cloneable);
            }
        }
        //如果不受克隆地点限制直接能克隆
        else
        {
            cloneable = true;
        }
        return cloneable;
    }

    private void CheckCloneable(Vector3 hitPoint, GameObject hitObj, CloneObjType cloneObjType, ref bool result)
    {
        if (cloneObjType != CloneObjType.Leak1 && cloneObjType != CloneObjType.Leak2)
        {
            result = true;
        }
        else
        {
            /*
             * 收特殊克隆条件限制,目前只有泄露
             * 注:泄露受储量限制,不能在储量高度之上克隆
             * */
            if (hitObj.GetComponentInParent<OilTankMessage>())
            {
                float dis = 0;
                RaycastHit[] AllHit = Physics.RaycastAll(hitPoint, Vector3.down, 100f, LayerMask.NameToLayer("SoliderRoad"));
                foreach (RaycastHit hit in AllHit)
                {
                    //if (hit.transform.name.Contains("DiMian"))
                    if (!hit.transform.GetComponentInParent<OilTankMessage>()
                            && hit.transform.name.Contains("Floor"))
                    {
                        dis = Vector3.Distance(hit.point, hitPoint);
                    }
                }
                var TankHeight = hitObj.GetComponentInParent<OilTankMessage>().MyBaseMessage.TankHeight;
                var OutShowHeight = hitObj.GetComponentInParent<OilTankMessage>().OutShowHeight;

                //if (dis > hitObj.GetComponent<OilTankMessage>().OutShowHeight)
                if (dis > OutShowHeight * TankHeight)
                {
                    result = false;
                    //TODO:弹出不能克隆的提示窗口
                    //Debug.Log("TODO:弹出不能克隆的提示窗口");
                }
                else
                {
                    result = true;
                }
            }    

        }
    }
}