package main

import (
	"bufio"
	"flag"
	"fmt"
	"io"
	"os"
	"strconv"
)

func findLoopSize(subject int, target int, debug bool) int {
	val := 1
	loopSize := 1
	for {
		val *= subject
		val %= 20201227
		if debug {
			fmt.Printf("%d\n", val)
		}
		if val == target {
			break
		}
		loopSize++
	}
	return loopSize
}

func transformKey(subject, loopSize int) int {
	val := 1
	for i := 0; i < loopSize; i++ {
		val *= subject
		val %= 20201227
	}
	return val
}

// Task1 ...
func Task1(input []int, debug bool) int {
	subjectNumber := 7
	loopA := findLoopSize(subjectNumber, input[0], debug)
	loopB := findLoopSize(subjectNumber, input[1], debug)

	fmt.Printf("loopSize for %d: %d\n", input[0], loopA)
	fmt.Printf("loopSize for %d: %d\n", input[1], loopB)

	a := transformKey(input[0], loopB)
	b := transformKey(input[1], loopA)

	fmt.Printf("encryption for %d@%d: %d\n", input[0], loopB, a)
	fmt.Printf("encryption for %d@%d: %d\n", input[1], loopA, b)

	if a == b {
		return a
	}
	return -1
}

// Task2 ...
func Task2(input []int, debug bool) int {
	return -1
}

func readInput(reader io.Reader) []int {
	input := make([]int, 0, 10)
	scanner := bufio.NewScanner(reader)
	for scanner.Scan() {
		val, _ := strconv.Atoi(scanner.Text())
		input = append(input, val)
	}
	return input
}

func main() {
	var debug bool
	flag.BoolVar(&debug, "debug", false, "debug")
	flag.Parse()

	file, _ := os.Open("input.txt")
	input := readInput(file)
	file.Close()

	result := Task1(input, debug)
	fmt.Printf("Task 1: %d\n", result)

	result = Task2(input, debug)
	fmt.Printf("Task 2: %d\n", result)
}