package data.scripts.campaign.intel;

import com.fs.starfarer.api.EveryFrameScript;
import com.fs.starfarer.api.Global;
import com.fs.starfarer.api.campaign.CampaignFleetAPI;
import com.fs.starfarer.api.campaign.FactionAPI;
import com.fs.starfarer.api.campaign.PlanetAPI;
import com.fs.starfarer.api.campaign.SectorEntityToken;
import com.fs.starfarer.api.campaign.SpecialItemData;
import com.fs.starfarer.api.campaign.StarSystemAPI;
import com.fs.starfarer.api.campaign.comm.IntelInfoPlugin.ArrowData;
import com.fs.starfarer.api.campaign.comm.IntelInfoPlugin.ListInfoMode;
import com.fs.starfarer.api.campaign.econ.MarketAPI;
import com.fs.starfarer.api.campaign.econ.SubmarketAPI;
import com.fs.starfarer.api.impl.campaign.fleets.FleetFactoryV3;
import com.fs.starfarer.api.impl.campaign.fleets.FleetParamsV3;
import com.fs.starfarer.api.impl.campaign.intel.BaseIntelPlugin;
import com.fs.starfarer.api.impl.campaign.procgen.SalvageEntityGenDataSpec.DropData;
import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseThemeGenerator;
import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseThemeGenerator.AddedEntity;
import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseThemeGenerator.EntityLocation;
import com.fs.starfarer.api.ui.SectorMapAPI;
import com.fs.starfarer.api.ui.TooltipMakerAPI;
import com.fs.starfarer.api.util.Misc;
import com.fs.starfarer.api.util.WeightedRandomPicker;
//import data.scripts.campaign.fleet.AL_GuardEntityFleetAI;
import java.awt.Color;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.Set;
import org.lazywizard.lazylib.MathUtils;
import org.lwjgl.util.vector.Vector2f;

public class SF_FaxIntel extends BaseIntelPlugin implements EveryFrameScript {

    public static final String MEM_LB = "$AL_lbmarket";
    private static final String LB_REASON = "allb";
    private StarSystemAPI pirateFleetSystem;
    private MarketAPI pirateStation;
    private CampaignFleetAPI fleet;

    public SF_FaxIntel(boolean hasskill) {

        if(hasskill) {
            this.spawnPirateFleet();
            this.spawnPirateStation();
        }else {

            this.spawnPirateFleet();
            this.addToBlackMarket();
        }



        if (this.pirateFleetSystem == null || this.pirateStation == null) {
            this.endImmediately();
        }

        Global.getSector().addScript(this);
    }

    protected void advanceImpl(float amount) {
        if (!this.isEnded() && !this.isEnding()) {
            this.endAfterDelay();
        }

        if (this.fleet != null) {
            if (this.fleet.isInCurrentLocation() && !this.fleet.getFaction().getId().equals("pirates")) {
                this.fleet.setFaction("pirates", true);
            } else if (!this.fleet.isInCurrentLocation() && !this.fleet.getFaction().getId().equals("neutral")) {
                this.fleet.setFaction("neutral", true);
            }

            if (!this.fleet.isAlive()) {
                this.fleet = null;
            }

        }
    }

    protected void notifyEnded() {
        super.notifyEnded();
        Global.getSector().removeScript(this);
    }

    private void spawnPirateFleet() {
        WeightedRandomPicker<StarSystemAPI> systemPicker = new WeightedRandomPicker();
        Iterator i$ = Global.getSector().getStarSystems().iterator();

        while(true) {
            StarSystemAPI system;
            float mult;
            do {
                do {
                    do {
                        if (!i$.hasNext()) {
                            StarSystemAPI system = (StarSystemAPI)systemPicker.pick();
                            if (system == null) {
                                return;
                            }

                            Random random = new Random();

                            int ships = MathUtils.getRandomNumberInRange(25, 40);
                            FleetParamsV3 param = new FleetParamsV3((MarketAPI)null, (Vector2f)null, "pirates", 1.0F, "patrolLarge", (float)ships * 8.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F);
                            this.fleet = FleetFactoryV3.createFleet(param);
                            system.spawnFleet(, 0.0F, 0.0F, this.fleet);
                            this.fleet.addScript(new AL_GuardEntityFleetAI(this.fleet, added.entity));
                            this.pirateFleetSystem = system;
                            return;
                        }

                        system = (StarSystemAPI)i$.next();
                    } while(system.hasTag("theme_remnant"));
                } while(system.hasPulsar());

                mult = 1.0F;
                if (system.hasTag("theme_misc_skip")) {
                    mult = 1.0F;
                } else if (system.hasTag("theme_misc")) {
                    mult = 3.0F;
                } else if (system.hasTag("theme_remnant_no_fleets")) {
                    mult = 3.0F;
                } else if (system.hasTag("theme_ruins")) {
                    mult = 5.0F;
                } else if (system.hasTag("theme_remnant_destroyed")) {
                    mult = 3.0F;
                } else if (system.hasTag("theme_core_unpopulated")) {
                    mult = 1.0F;
                }

                Iterator i$ = Misc.getMarketsInLocation(system).iterator();

                while(i$.hasNext()) {
                    MarketAPI market = (MarketAPI)i$.next();
                    if (!market.isHidden()) {
                        mult = 0.0F;
                        break;
                    }
                }

                float distToPlayer = Misc.getDistanceToPlayerLY(system.getLocation());
                float noSpawnRange = Global.getSettings().getFloat("personBountyNoSpawnRangeAroundPlayerLY");
                if (distToPlayer < noSpawnRange) {
                    mult = 0.0F;
                }
            } while(mult <= 0.0F);

            float weight = (float)system.getPlanets().size();
            Iterator i$ = system.getPlanets().iterator();

            while(i$.hasNext()) {
                PlanetAPI planet = (PlanetAPI)i$.next();
                if (!planet.isStar() && planet.getMarket() != null) {
                    float h = planet.getMarket().getHazardValue();
                    if (h <= 0.0F) {
                        weight += 5.0F;
                    } else if (h <= 0.25F) {
                        weight += 3.0F;
                    } else if (h <= 0.5F) {
                        ++weight;
                    }
                }
            }

            float dist = system.getLocation().length();
            float distMult = Math.max(0.0F, 40000.0F - dist);
            systemPicker.add(system, weight * mult * distMult);
        }
    }

    private void addToBlackMarket() {
        List<MarketAPI> markets = Global.getSector().getEconomy().getMarketsCopy();
        WeightedRandomPicker<MarketAPI> marketPicker = new WeightedRandomPicker();
        FactionAPI approlight = Global.getSector().getFaction("approlight");
        Iterator i$ = markets.iterator();

        while(i$.hasNext()) {
            MarketAPI market = (MarketAPI)i$.next();
            float weight = 1.0F;
            if (market.hasSubmarket("black_market")) {
                FactionAPI faction = market.getFaction();
                if (faction == approlight) {
                    weight *= 0.5F;
                }

                weight *= market.getStabilityValue();
                marketPicker.add(market, weight);
            }
        }

        MarketAPI market = (MarketAPI)marketPicker.pick();
        SubmarketAPI black = market.getSubmarket("black_market");
        black.getCargo().addSpecial(new SpecialItemData("AL_lockboxpw", (String)null), 1.0F);
        market.getMemoryWithoutUpdate().set("$AL_lbmarket", true);
        this.blackMarket = market;
    }

    public void createIntelInfo(TooltipMakerAPI info, ListInfoMode mode) {
        Color h = Misc.getHighlightColor();
        Color g = Misc.getGrayColor();
        Color c = this.getTitleColor(mode);
        float pad = 3.0F;
        float opad = 10.0F;
        info.addPara(this.getName(), c, 0.0F);
        this.addBulletPoints(info, mode);
    }

    public String getSmallDescriptionTitle() {
        return this.getName();
    }

    public void createSmallDescription(TooltipMakerAPI info, float width, float height) {
        Color h = Misc.getHighlightColor();
        Color g = Misc.getGrayColor();
        Color tc = Misc.getTextColor();
        float pad = 3.0F;
        float opad = 10.0F;
        info.addPara(SECTION.format("summary", new Object[0]), pad);
        this.addBulletPoints(info, ListInfoMode.IN_DESC);
    }

    protected void addBulletPoints(TooltipMakerAPI info, ListInfoMode mode) {
        Color h = Misc.getHighlightColor();
        Color g = Misc.getGrayColor();
        float pad = 3.0F;
        float opad = 10.0F;
        float initPad = pad;
        if (mode == ListInfoMode.IN_DESC) {
            initPad = opad;
        }

        this.getBulletColorForMode(mode);
        this.bullet(info);
        boolean isUpdate = this.getListInfoParam() != null;
        info.addPara(SECTION.format("place1", new Object[]{this.pirateFleetSystem.getName()}), initPad);
        info.addPara(SECTION.format("place2", new Object[]{this.blackMarket.getStarSystem().getName(), this.blackMarket.getName()}), initPad);
        this.unindent(info);
    }

    public Set<String> getIntelTags(SectorMapAPI map) {
        Set<String> tags = super.getIntelTags(map);
        tags.add("Story");
        return tags;
    }

    public List<ArrowData> getArrowData(SectorMapAPI map) {
        List<ArrowData> datas = new ArrayList();
        CampaignFleetAPI playerFleet = Global.getSector().getPlayerFleet();
        ArrowData data1 = new ArrowData(playerFleet, this.pirateFleetSystem.getCenter());
        data1.color = this.getFactionForUIColors().getBaseUIColor();
        ArrowData data2 = new ArrowData(playerFleet, this.blackMarket.getPrimaryEntity());
        data2.color = this.getFactionForUIColors().getBaseUIColor();
        datas.add(data1);
        datas.add(data2);
        return datas;
    }

    public SectorEntityToken getMapLocation(SectorMapAPI map) {
        CampaignFleetAPI playerFleet = Global.getSector().getPlayerFleet();
        return playerFleet;
    }

    public String getIcon() {
        return Global.getSettings().getSpriteName("intel", "AL_lockBox");
    }

    public String getName() {
        return !this.isEnded() && !this.isEnding() ? SECTION.format("title", new Object[0]) : SECTION.format("title", new Object[0]) + " - " + SECTION.nm_format("short_completed", new Object[0]);
    }

    public static class LockBoxData {
        public static final int MAX_PROGRESS = 2;
        private static final String KEY = "AL_lbdata";
        public int unlockProcess = 0;

        public LockBoxData() {
        }

        public static AL_LockBoxIntel.LockBoxData getData() {
            AL_LockBoxIntel.LockBoxData data;
            if (!Global.getSector().getPersistentData().containsKey("AL_lbdata")) {
                data = new AL_LockBoxIntel.LockBoxData();
                Global.getSector().getPersistentData().put("AL_lbdata", data);
            } else {
                data = (AL_LockBoxIntel.LockBoxData)Global.getSector().getPersistentData().get("AL_lbdata");
            }

            return data;
        }

        public void advanceProgress() {
            ++this.unlockProcess;
        }

        public boolean isTotallyUnlocked() {
            return this.unlockProcess >= 2;
        }
    }
}




}
