package dna

import (
	"errors"
	"strings"
)

// Histogram is just a map
type Histogram map[byte]int

// DNAProc is a struct that holds a dna strand
type DNAProc struct {
	strand string
}

// DNA is the function that creates DNAProcs
func DNA(st string) *DNAProc {
	return &DNAProc{strand: st}
}

// Count takes a nucleotide byte and returns how many there are
// or an error if it's an invalid nucleotide
func (d *DNAProc) Count(n byte) (int, error) {
	if n != 'A' && n != 'C' && n != 'G' && n != 'T' {
		return 0, errors.New("Invalid Nucleotide " + string(n))
	}
	return strings.Count(d.strand, string(n)), nil
}

// Counts returns a Histogram of all nucleotide counts
func (d *DNAProc) Counts() Histogram {
	h := make(Histogram)
	h['A'], _ = d.Count('A')
	h['C'], _ = d.Count('C')
	h['G'], _ = d.Count('G')
	h['T'], _ = d.Count('T')
	return h
}
