package stsjorbsmod.cards.wanderer;

import com.megacrit.cardcrawl.cards.DamageInfo;
import com.megacrit.cardcrawl.characters.AbstractPlayer;
import com.megacrit.cardcrawl.monsters.AbstractMonster;
import stsjorbsmod.JorbsMod;
import stsjorbsmod.actions.PatronAction;
import stsjorbsmod.cards.CustomJorbsModCard;
import stsjorbsmod.cards.DowngradeableCard;
import stsjorbsmod.characters.Wanderer;
import stsjorbsmod.patches.EntombedField;
import stsjorbsmod.patches.EphemeralField;
import stsjorbsmod.patches.SelfExhumeFields;
import stsjorbsmod.util.CardMetaUtils;
import stsjorbsmod.util.EffectUtils;

import static com.megacrit.cardcrawl.core.CardCrawlGame.languagePack;
import static stsjorbsmod.JorbsMod.JorbsCardTags.LEGENDARY;

public class Patron extends CustomJorbsModCard implements DowngradeableCard {
    public static final String ID = JorbsMod.makeID(Patron.class);

    private static final CardRarity RARITY = CardRarity.UNCOMMON;
    private static final CardTarget TARGET = CardTarget.ENEMY;
    private static final CardType TYPE = CardType.ATTACK;
    public static final CardColor COLOR = Wanderer.Enums.WANDERER_CARD_COLOR;

    private static final int COST = 0;
    private static final int DAMAGE = 40;
    private static final int UPGRADE_PLUS_DAMAGE = 10;

    public Patron() {
        super(ID, COST, TYPE, COLOR, RARITY, TARGET);
        baseDamage = DAMAGE;
        EntombedField.entombed.set(this, true);
        EphemeralField.ephemeral.set(this, true);
        SelfExhumeFields.selfExhumeOnSnap.set(this, true);

        tags.add(LEGENDARY);
    }

    @Override
    public void use(AbstractPlayer p, AbstractMonster m) {
        if (upgraded) {
            addToBot(new PatronAction(m, new DamageInfo(p, damage), this, CardMetaUtils::downgradeCardPermanently, EffectUtils::showDowngradeEffect));
        } else {
            addToBot(new PatronAction(m, new DamageInfo(p, damage), this, CardMetaUtils::destroyCardPermanently, EffectUtils::showDestroyEffect));
        }
    }

    @Override
    public void upgrade() {
        if (!upgraded) {
            upgradeName();
            upgradeDamage(UPGRADE_PLUS_DAMAGE);
            upgradeDescription();
        }
    }

    @Override
    public void downgrade() {
        if (upgraded) {
            --timesUpgraded;
            upgraded = false;
            name = originalName;
            initializeTitle();
            baseDamage -= UPGRADE_PLUS_DAMAGE;
            upgradedDamage = false;
            rawDescription = languagePack.getCardStrings(cardID).DESCRIPTION;
            initializeDescription();
        }
    }
}