import java.util.ArrayList;
import java.util.Scanner;
import java.io.*;
//=================================================================================================
public class FileTextEdit {
//-------------------------------------------------------------------------------------------------
    private static final Scanner keyboard = new Scanner(System.in);
//-------------------------------------------------------------------------------------------------
    public static void main(String[] args) {

        ArrayList<String> lines = new ArrayList<>();

        if (args.length != 1) {
            System.out.println("Must provide a file name");
            return;
        }

        try {
            readTextFile(args[0],lines);
        } catch (IOException e) {
            System.out.println(e.getMessage());
            return;
        }

        editLines(lines);

        try {
            writeTextFile(args[0],lines);
        } catch (IOException e) {
            System.out.println(e.getMessage());
            return;
        }
    }
//-------------------------------------------------------------------------------------------------
    private static void readTextFile(String fileName,ArrayList<String> lines) throws IOException {

        BufferedReader fromBufferedReader;
        String oneLine;

        fromBufferedReader = new BufferedReader(new FileReader(fileName));

        oneLine = fromBufferedReader.readLine();
        while (oneLine != null) {
            lines.add(oneLine);
            oneLine = fromBufferedReader.readLine();
        }
        fromBufferedReader.close();
    }
//-------------------------------------------------------------------------------------------------
    private static void writeTextFile(String fileName,ArrayList<String> lines) throws IOException {

        PrintWriter toPrintWriter;
        int lineNumber;

        toPrintWriter = new PrintWriter(new FileOutputStream(fileName));

        for (lineNumber = 0; lineNumber < lines.size(); lineNumber++) {
            toPrintWriter.println(lines.get(lineNumber));
        }

        toPrintWriter.close();
    }
//-------------------------------------------------------------------------------------------------
    private static void editLines(ArrayList<String> lines) {

        char option;
        int editLineNumber;
        int lineNumber;

        do {
            System.out.print("(L)ist, (D)elete, (A)dd, (C)hange, e(X)it : ");
            option = Character.toUpperCase(keyboard.nextLine().charAt(0));
            switch (option) {
                case 'L':
                    for (lineNumber = 0; lineNumber < lines.size();lineNumber++) {
                        System.out.printf("%3d %s\n",lineNumber ,lines.get(lineNumber));
                    }
                    break;
                case 'D':
                    lines.remove(getLineNumber(lines.size()));
                    break;
                case 'A':
                    editLineNumber = getLineNumber(lines.size()+1);
                    System.out.print("New line : ");
                    lines.add(editLineNumber,keyboard.nextLine());
                    break;
                case 'C':
                    editLineNumber = getLineNumber(lines.size());
                    System.out.print("New line : ");
                    lines.set(editLineNumber,keyboard.nextLine());
                    break;
                case 'X':
                    break;
                default:
                    System.out.println("Invalid choice");
                    break;
            }
        } while (option != 'X');
    }
//-------------------------------------------------------------------------------------------------
    private static int getLineNumber(int lastLineNumber) {

        int lineNumber;

        do {
            System.out.print("Line number: ");
            lineNumber = keyboard.nextInt();
            keyboard.nextLine();
        } while (lineNumber < 0 || lineNumber > lastLineNumber);

        return(lineNumber);
    }
//-------------------------------------------------------------------------------------------------
}
//=================================================================================================
