package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	// readFile()
	// writeFile()
	// scanFile()
	readWrite()
}

// Чтение файла построчно с bufio.Reader
func readFile() {
	file, err := os.Open("data.txt")
	if err != nil {
		fmt.Printf("Ошибка открытия файла: %v\n", err)
		return
	}
	defer func() {
		if err := file.Close(); err != nil {
			fmt.Printf("Ошибка закрытия файла %v\n", err)
		} else {
			fmt.Println("Файл закрыт")
		}
	}()

	reader := bufio.NewReader(file)
	for {
		line, err := reader.ReadString('\n')
		if err != nil {
			if err.Error() != "EOF" {
				fmt.Printf("Ошибка чтения файла: %v\n")
			}
			break
		}
		processLine(line)
	}
}

// Функция обработки строк
func processLine(line string) {
	fmt.Print(line) // здесь можно добавить любую обработку строки
}

// Буферизированная запись в файл с bufio.Writer
func writeFile() {
	file, err := os.Create("output.txt")
	if err != nil {
		fmt.Printf("Ошибка создания файла %v\n", err)
		return
	}
	defer func() {
		if err := file.Close(); err != nil {
			fmt.Printf("Ошибка закрытия файла: %v\n", err)
		}
	}()

	writer := bufio.NewWriter(file)
	for i := 1; i < 100; i++ {
		_, err := writer.WriteString(fmt.Sprintf("Строка номер %d\n", i))
		if err != nil {
			fmt.Printf("Ошибка записи: %v\n", err)
			return
		}
	}

	if err := writer.Flush(); err != nil {
		fmt.Printf("Ошибка сброса буфера: %v\n", err)
	}
}

// bufio.Scanner для простого чтения
func scanFile() {
	file, err := os.Open("data.txt")
	if err != nil {
		fmt.Printf("Ошибка открытия файла: %v\n", err)
		return
	}
	defer file.Close()

	scanner := bufio.NewScanner(file)
	lineNumber := 1
	for scanner.Scan() {
		fmt.Printf("Строка %d: %s\n", lineNumber, scanner.Text())
		lineNumber++
	}

	if err := scanner.Err(); err != nil {
		fmt.Printf("Ошибка сканирования: %v\n", err)
	}
}

// Комбинированное чтение и запись с bufio.ReadWriter
func readWrite() {
	file, err := os.OpenFile("readwriter.txt", os.O_RDWR|os.O_CREATE, 0644)
	if err != nil {
		fmt.Printf("Ошибка открытия файла: %v\n", err)
		return
	}
	defer func() {
		if err := file.Close(); err != nil {
			fmt.Printf("Ошибка закрытия файла: %v\n", err)
		}
	}()

	rw := bufio.NewReadWriter(bufio.NewReader(file), bufio.NewWriter(file))

	// Чтение первой строки
	line, err := rw.ReadString('\n')
	if err != nil {
		fmt.Printf("Ошибка чтения: %v\n", err)
		return
	}
	fmt.Printf("Прочитано %s", line)

	// Переход в конец файла для записи
	_, err = rw.WriteString("Добавленная строка\n")
	if err != nil {
		fmt.Printf("Ошибка записи: %v\n", err)
		return
	}

	// Сброс буфера
	if err := rw.Flush(); err != nil {
		fmt.Printf("Ошибка сброса буфера: %v\n", err)
	}
}
