package solutions

import (
	"fmt"
	"log"
	"strconv"
	"strings"

	"gitlab.com/fizzizist/go-rosalind/pkg/io"
)

func CompileOutput(consensus string, profile [][]int) []string {
	output := []string{consensus}
	idxMap := []string{"A", "C", "G", "T"}

	for i, val := range profile {
		var strProf []string
		for _, inVal := range val {
			strProf = append(strProf, strconv.Itoa(inVal))
		}
		output = append(output, fmt.Sprintf("%s: %s", idxMap[i], strings.Join(strProf, " ")))
	}

	return output
}

func Cons(filename string) {
	_, lines, err := io.ParseFasta(filename)
	if err != nil {
		log.Fatalf("Failed to read file: %s", err)
	}

	profile := make([][]int, 4) // 1 for each codon
	for i := range profile {
		profile[i] = make([]int, len(lines[1]))
	}

	for _, value := range lines {
		for j, s := range value {
			switch {
			case s == 'A':
				profile[0][j]++
			case s == 'C':
				profile[1][j]++
			case s == 'G':
				profile[2][j]++
			case s == 'T':
				profile[3][j]++
			}
		}
	}

	var consensus []string
	idxMap := []string{"A", "C", "G", "T"}
	for i := range profile[0] {
		maxCons := "A"
		maxVal := 0
		for j, s := range idxMap {
			if profile[j][i] > maxVal {
				maxCons = s
				maxVal = profile[j][i]
			}
		}
		consensus = append(consensus, maxCons)
	}

	fmt.Println("Writing output file...")
	err = io.WriteStringsToFile(
		CompileOutput(strings.Join(consensus, ""), profile),
		"results/cons.txt",
	)
	if err != nil {
		log.Fatalf("Failed writing output file: %s", err)
	}
	fmt.Println("Done.")
}