package main

import (
	"fmt"
	"os"
)

// Формирует файл /var/result/data.txt так,
// что каждая строка файла - количество символов в именах файлов из каталога /var/data.

const INPUT = "/var/data"
const OUTPUT = "/data/result"

func GetListFilesInDirectory(directory string) ([]string, error) {
	f, err := os.Open(directory)
	if err != nil {
		fmt.Println(err)
		return nil, err
	}
	files, err := f.Readdir(0)
	if err != nil {
		fmt.Println(err)
		return nil, err
	}

	var fileNames []string
	for _, file := range files {
		fileName := file.Name()
		fileNames = append(fileNames, fileName)
	}
	return fileNames, nil
}

func Exists(name string) (bool, error) {
	_, err := os.Stat(name)
	if os.IsNotExist(err) {
		return false, nil
	}
	return err != nil, err
}

func CreateFileOrOpenIfExist(name string) (*os.File, error) {
	exists, err := Exists(name)
	if err != nil {
		return nil, err
	}
	if exists {
		return os.OpenFile(name, os.O_WRONLY|os.O_CREATE, 0664)
	}
	return os.Create(name)
}

func CreateFileAndWriteData(filename string, lines []string) error {
	file, err := CreateFileOrOpenIfExist(filename)
	if err != nil {
		return err
	}

	for _, line := range lines {
		_, err = fmt.Fprintf(file, line)
		if err != nil {
			return err
		}
	}

	err = file.Close()
	if err != nil {
		return err
	}

	return nil
}

func main() {
	filenames, err := GetListFilesInDirectory(INPUT)

	if err != nil {
		fmt.Println(err)
		return
	}

	var lenghtOfFilenames []string
	for _, filename := range filenames {
		fmt.Println(filename)
		lenghtOfFilenames = append(lenghtOfFilenames, fmt.Sprintf("%d", len(filename)))
	}

	err = CreateFileAndWriteData(OUTPUT+"/data.txt", filenames)
	if err != nil {
		return
	}

	fmt.Println("First Service is end.")
}
