package common.entity;

import common.color.TextColor;
import common.entity.projectile.EntityProjectile;
import common.entity.types.EntityLiving;
import common.world.Explosion;

public class DamageSource
{
    public static final DamageSource inFire = 
    		(new DamageSource(TextColor.ORANGE, "%s ging in Flammen auf", "%s lief ins Feuer, während er mit %s kämpfte", "%s ins Feuer gelaufen")).setFireDamage();
    public static final DamageSource onFire = 
    		(new DamageSource(TextColor.ORANGE, "%s wurde zu heiß und verbrannte", "%s wurde während des Kampfes mit %s geröstet", "%s geröstet")).setDamageBypassesArmor().setFireDamage();
    public static final DamageSource hotLiquid = 
    		(new DamageSource(TextColor.ORANGE, "%s versuchte in einer unangenehm brennenden Flüssigkeit zu schwimmen", "%s fiel beim Versuch %s zu entkommen in eine unangenehm brennende Flüssigkeit", "%s in unangenehm brennender Flüssigkeit gelandet")).setFireDamage();
    public static final DamageSource molten = 
    		(new DamageSource(TextColor.ORANGE, "%s versuchte dem Magmaregen zu trotzen", "%s geriet beim Versuch %s zu entkommen in Magmaregen", "%s in Magmaregen geraten")).setFireDamage();
    public static final DamageSource inWall = 
    		(new DamageSource(TextColor.GRAY, "%s wurde lebendig begraben")).setDamageBypassesArmor();
    public static final DamageSource dry = 
    		(new DamageSource(TextColor.GRAY, "%s ist vertrocknet", "%s ist beim Versuch %s zu entkommen vertrocknet", "%s vertrocknet")).setDamageBypassesArmor();
    public static final DamageSource cactus = 
    		new DamageSource(TextColor.ORK, "%s wurde zu Tode gestochen", "%s rannte beim Versuch %s zu entkommen in einen Kaktus", "%s in Kaktus gerannt");
    public static final DamageSource fall = 
    		(new DamageSource(TextColor.NEON, "%s fiel der Schwerkraft zum Opfer")).setDamageBypassesArmor();
    public static final DamageSource outOfWorld = 
    		(new DamageSource(TextColor.DGRAY, "%s fiel aus der Welt")).setDamageBypassesArmor();
    public static final DamageSource generic = 
    		(new DamageSource(TextColor.LGRAY, "%s starb")).setDamageBypassesArmor();
    public static final DamageSource magic = 
    		(new DamageSource(TextColor.DMAGENTA, "%s wurde durch Magie getötet")).setDamageBypassesArmor().setMagicDamage();
    public static final DamageSource anvil = 
    		new DamageSource(TextColor.DRED, "%s wurde von einem fallenden Amboss zerquetscht");
    public static final DamageSource fallingBlock = 
    		new DamageSource(TextColor.GRAY, "%s wurde von einem fallenden Block zerquetscht");
    public static final DamageSource radiation = 
    		(new DamageSource(TextColor.GREEN, "%s hat seine Halbwertszeit nicht rechtzeitig erreicht")).setDamageBypassesArmor();
    
    protected final String display;
    protected final String displayExtra;
    protected final String displayKill;
    protected final TextColor color;
    
    private boolean isUnblockable;
    private boolean fireDamage;
    private boolean projectile;
    private boolean magicDamage;
    private boolean explosion;

    public static DamageSource causeMobDamage(EntityLiving mob)
    {
        return new EntityDamageSource(TextColor.CRIMSON, "%s wurde von %s erschlagen", "%s wurde von %s mit %s erschlagen", 
        		"%s erschlagen", "%s mit %s erschlagen", mob);
    }
    
    public static DamageSource causeLightningDamage(EntityLiving mob)
    {
        return mob == null ? new DamageSource(TextColor.YELLOW, "%s wurde vom Blitz getroffen und gegrillt") : 
        	new EntityDamageSource(TextColor.YELLOW, "%s wurde von %s gegrillt", "%s wurde von %s mit %s gegrillt", 
        			"%s gegrillt", "%s mit %s gegrillt", mob);
    }
    
    public static DamageSource causeExterminatusDamage(EntityLiving mob)
    {
        return mob == null ? new DamageSource(TextColor.DRED, "%s wurde vernichtet") : 
        	new EntityDamageSource(TextColor.DRED, "%s wurde von %s vernichtet", "%s wurde von %s mit %s vernichtet", 
        			"%s vernichtet", "%s mit %s vernichtet", mob);
    }
    
    public static DamageSource causeShotDamage(Entity projectile, Entity shooter)
    {
        return (new EntityDamageSourceIndirect(TextColor.RED, "%s wurde von %s erschossen", "%s wurde von %s mit %s erschossen", "%s erschossen", "%s mit %s erschossen", projectile, shooter)).setProjectile();
    }
    
    public static DamageSource causeFireballDamage(EntityProjectile fireball, Entity shooter)
    {
        return shooter == null ? (new EntityDamageSourceIndirect(TextColor.YELLOW, "%s wurde von %s flambiert", fireball)).setFireDamage().setProjectile() : (new EntityDamageSourceIndirect(TextColor.YELLOW, "%s wurde von %s flambiert", "%s wurde von %s mit %s flambiert", "%s flambiert", "%s mit %s flambiert", fireball, shooter)).setFireDamage().setProjectile();
    }

    public static DamageSource causeThrownDamage(Entity source, Entity thrower)
    {
        return (new EntityDamageSourceIndirect(TextColor.DGREEN, "%s wurde von %s zu Tode geprügelt", "%s wurde von %s mit %s zu Tode geprügelt", "%s zu Tode geprügelt", "%s mit %s zu Tode geprügelt", source, thrower)).setProjectile();
    }

    public static DamageSource causeTeleFragDamage(Entity source, Entity replacer)
    {
        return (new EntityDamageSourceIndirect(TextColor.MAGENTA, "%s wurde von %s verdrängt", "%s wurde von %s mit %s verdrängt", "%s verdrängt", "%s mit %s verdrängt", source, replacer)).setDamageBypassesArmor();
    }

    public static DamageSource causeIndirectMagicDamage(Entity source, Entity mage)
    {
        return (new EntityDamageSourceIndirect(TextColor.DMAGENTA, "%s wurde von %s mit Magie getötet", "%s wurde von %s mit %s getötet", "%s mit Magie getötet", "%s mit %s getötet", source, mage)).setDamageBypassesArmor().setMagicDamage();
    }
    
    public static DamageSource causeThornsDamage(Entity source)
    {
        return (new EntityDamageSource(TextColor.ORK, "%s wurde beim Versuch %s zu verletzen getötet", "%s durch Dornen getötet", source)).setIsThornsDamage().setMagicDamage();
    }

    public static DamageSource causeExplosionDamage(Explosion explosion)
    {
        return explosion != null && explosion.getExplosivePlacedBy() != null ? (new EntityDamageSource(TextColor.YELLOW, "%s wurde durch %s in die Luft gesprengt", "%s in die Luft gesprengt", explosion.getExplosivePlacedBy())).setExplosion() : (new DamageSource(TextColor.YELLOW, "%s wurde in die Luft gesprengt")).setExplosion();
    }

    /**
     * Returns true if the damage is projectile based.
     */
    public boolean isProjectile()
    {
        return this.projectile;
    }

    /**
     * Define the damage type as projectile based.
     */
    public DamageSource setProjectile()
    {
        this.projectile = true;
        return this;
    }

    public boolean isExplosion()
    {
        return this.explosion;
    }

    public DamageSource setExplosion()
    {
        this.explosion = true;
        return this;
    }

    public boolean isUnblockable()
    {
        return this.isUnblockable;
    }

    protected DamageSource(TextColor color, String display, String extra, String kill)
    {
        this.color = color;
        this.display = this.color + display;
        this.displayExtra = this.color + extra;
        this.displayKill = this.color + "* " + kill;
    }

    protected DamageSource(TextColor color, String display)
    {
        this(color, display, display, "");
    }

    public Entity getSourceOfDamage()
    {
        return this.getEntity();
    }

    public Entity getEntity()
    {
        return null;
    }

    protected DamageSource setDamageBypassesArmor()
    {
        this.isUnblockable = true;
        return this;
    }

    /**
     * Define the damage type as fire based.
     */
    protected DamageSource setFireDamage()
    {
        this.fireDamage = true;
        return this;
    }

    /**
     * Gets the death message that is displayed when the player dies
     *  
     * @param victim The EntityLivingBase that died
     */
    public String getDeathMessage(EntityLiving victim)
    {
        EntityLiving killer = victim.getAttackingEntity();
//        String s = this.display;
//        String s1 = s + "Player";
        return killer != null ? String.format(this.displayExtra, victim.getColoredName(this.color), killer.getColoredName(this.color)) : String.format(this.display, victim.getColoredName(this.color));
    }
    
    public String getKillMessage(EntityLiving victim)
    {
    	return String.format(this.displayKill, victim.getColoredName(this.color));
    }

    /**
     * Returns true if the damage is fire based.
     */
    public boolean isFireDamage()
    {
        return this.fireDamage;
    }

//    /**
//     * Return the name of damage type.
//     */
//    public String getDamageType()
//    {
//        return this.damageType;
//    }

//    /**
//     * Set whether this damage source will have its damage amount scaled based on the current difficulty.
//     */
//    public DamageSource setDifficultyScaled()
//    {
//        this.difficultyScaled = true;
//        return this;
//    }

//    /**
//     * Return whether this damage source will have its damage amount scaled based on the current difficulty.
//     */
//    public boolean isDifficultyScaled()
//    {
//        return this.difficultyScaled;
//    }

    /**
     * Returns true if the damage is magic based.
     */
    public boolean isMagicDamage()
    {
        return this.magicDamage;
    }

    /**
     * Define the damage type as magic based.
     */
    public DamageSource setMagicDamage()
    {
        this.magicDamage = true;
        return this;
    }

//    public boolean isCreativePlayer()
//    {
//        Entity entity = this.getEntity();
//        return entity.isPlayer() && ((EntityNPC)entity).creative;
//    }
}
