package com.javarush.task.task20.task2002;

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

/*
Читаем и пишем в файл: JavaRush
*/
public class Solution {
    public static void main(String[] args) {
        //you can find your_file_name.tmp in your TMP directory or adjust outputStream/inputStream according to your file's actual location
        //вы можете найти your_file_name.tmp в папке TMP или исправьте outputStream/inputStream в соответствии с путем к вашему реальному файлу
        try {
            File yourFile = File.createTempFile("your_file_name", null);
            OutputStream outputStream = new FileOutputStream("C:/in.txt");
            InputStream inputStream = new FileInputStream("C:/in.txt");

            JavaRush javaRush = new JavaRush();
            //initialize users field for the javaRush object here - инициализируйте поле users для объекта javaRush тут
            User user = new User();
            user.setFirstName("Rubi");
            user.setLastName("Rail");
            user.setBirthDate(new Date(1508944516168L));
            user.setMale(true);
            user.setCountry(User.Country.OTHER);

            User user1 = new User();
            user1.setFirstName(null);
            user1.setLastName(null);
            user1.setBirthDate(null);
            user1.setMale(true);
            user1.setCountry(User.Country.RUSSIA);

            User user3 = new User();
            user3.setFirstName("Solo");
            user3.setLastName("Han");
            user3.setBirthDate(new Date(1508944516169L));
            user3.setMale(true);
            user3.setCountry(User.Country.UKRAINE);

            JavaRush.users.add(user);
            JavaRush.users.add(user1);
            JavaRush.users.add(user3);
            javaRush.save(outputStream);
            outputStream.flush();

            JavaRush loadedObject = new JavaRush();
            loadedObject.load(inputStream);
            //here check that the javaRush object is equal to the loadedObject object - проверьте тут, что javaRush и loadedObject равны
            outputStream.close();
            inputStream.close();

        } catch (IOException e) {
//            e.printStackTrace();
            System.out.println("Oops, something is wrong with my file");
        } catch (Exception e) {
            //e.printStackTrace();
            System.out.println("Oops, something is wrong with the save/load method");
        }
    }

    public static class JavaRush {
        public static List<User> users = new ArrayList<>();

        public void save(OutputStream outputStream) throws Exception {
            PrintWriter printWriter = new PrintWriter(outputStream);
            String isUserPresent = !users.isEmpty() ? "yes" :"no";
            printWriter.println(isUserPresent);
            if (isUserPresent.equals("yes")) {
                for (User user : users) {
                    String firstName = user.getFirstName() == null ? "null" : user.getFirstName();
                    printWriter.println(firstName);
                    String lastName = user.getLastName() == null ? "null" : user.getLastName();
                    printWriter.println(lastName);
                    String birthDate = user.getBirthDate() == null ? "null" : String.valueOf(user.getBirthDate().getTime());
                    printWriter.println(birthDate);

                    printWriter.println(user.isMale());
                    String country = user.getCountry() == null ? "null" : user.getCountry().getDisplayName();
                    printWriter.println(country);
                }
            }
            printWriter.flush();
            printWriter.close();
        }

        public void load(InputStream inputStream) throws IOException {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            String isUserPresets = bufferedReader.readLine();
            if (isUserPresets.equals("yes")) {
                while (bufferedReader.ready()) {
                    User user = new User();

                    String firstName = bufferedReader.readLine();
                    if (firstName.equals("null"))
                        user.setFirstName(null);
                    else user.setFirstName(firstName);
//                    System.out.println(firstName);

                    String lastName = bufferedReader.readLine();
                    if (lastName.equals("null"))
                        user.setLastName(null);
                    else user.setLastName(lastName);
//                    System.out.println(lastName);

                    String birthDate = bufferedReader.readLine();
                    if (birthDate.equals("null"))
                        user.setBirthDate(null);
                    else user.setBirthDate(new Date(Long.parseLong(birthDate)));
//                    System.out.println(birthDate);

                    boolean isMale = Boolean.parseBoolean(bufferedReader.readLine());
                    user.setMale(isMale);
//                    System.out.println(isMale);

                    String country = bufferedReader.readLine();
                    if (country.equals("null"))
                        user.setCountry(null);
                    else {
                        switch (country) {
                            case "Ukraine":
                                user.setCountry(User.Country.UKRAINE);
                                break;
                            case "Russia":
                                user.setCountry(User.Country.RUSSIA);
                                break;
                            case "Other":
                                user.setCountry(User.Country.OTHER);
                                break;
                        }
                    }
//                    System.out.println(country);
                    users.add(user);
                }
            }

            bufferedReader.close();

        }
    }


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        JavaRush javaRush = (JavaRush) o;

        return JavaRush.users != null ? JavaRush.users.equals(javaRush.users) : javaRush.users == null;

    }

    @Override
    public int hashCode() {
        return JavaRush.users != null ? JavaRush.users.hashCode() : 0;
    }
}