package main

import (
	"fmt"
	"strings"
)

type Group struct {
	Units        int
	HitPoints    int
	AttackDamage int
	AttackType   string
	Initiative   int
	Immunities   []string
	Weaknesses   []string

	Attacker *Group
	Target   *Group
}

func (g Group) EffectivePower() int {
	return g.Units * g.AttackDamage
}

func (g Group) DamageDealt(e *Group) int {
	if ContainsString(e.Immunities, g.AttackType) {
		return 0
	}
	if ContainsString(e.Weaknesses, g.AttackType) {
		return g.EffectivePower() * 2
	}
	return g.EffectivePower()
}

func (g Group) String() string {
	out := fmt.Sprintf("%d units each with %d hit points", g.Units, g.HitPoints)
	if len(g.Immunities) > 0 || len(g.Weaknesses) > 0 {
		out += " ("
		if len(g.Immunities) > 0 {
			out += "immune to " + strings.Join(g.Immunities, " and ")
			if len(g.Weaknesses) > 0 {
				out += "; "
			}
		}
		if len(g.Weaknesses) > 0 {
			out += "weak to " + strings.Join(g.Weaknesses, " and ")
		}
		out += ")"
	}
	out += fmt.Sprintf(" with an attack that does %d %s damage at initiative %d", g.AttackDamage, g.AttackType, g.Initiative)
	return out
}