package main

import (
	"bufio"
	"log"
	"os"
	"strings"
)

type groupCustom map[rune]bool

func main() {
	if err := realMain(); err != nil {
		log.Println(err)
	}
}

func realMain() error {
	customs, err := parseInput()
	if err != nil {
		return err
	}

	var sum int
	for _, c := range customs {
		sum += len(c)
	}
	log.Println("Sum of customs:", sum)

	return nil
}

func parseInput() ([]groupCustom, error) {
	fd, err := os.Open("input.txt")
	if err != nil {
		return nil, err
	}
	defer fd.Close()

	var data []string
	buf := bufio.NewScanner(fd)
	tmp := strings.Builder{}
	for buf.Scan() {
		if buf.Text() == "" {
			data = append(data, tmp.String()[1:]) // trim leading space
			tmp.Reset()
		} else {
			tmp.WriteByte(' ')
			tmp.WriteString(buf.Text())
		}
	}
	data = append(data, tmp.String()[1:])

	customs := make([]groupCustom, len(data))
	for i, d := range data {
		customs[i] = parseCustom(d)
	}

	return customs, nil
}

func parseCustom(in string) groupCustom {
	ppl := strings.Split(in, " ")

	ret := groupCustom{}
	for _, ch := range ppl[0] {
		ret[ch] = true
	}

	for k := range ret {
		for _, p := range ppl[1:] {
			if !strings.ContainsRune(p, k) {
				delete(ret, k)
			}
		}
	}

	return ret
}