/* Читаем и пишем в файл: Human Реализуй логику записи в файл и чтения из файла для класса Human. Поле name в классе Human не может быть пустым. Метод main реализован только для вас и не участвует в тестировании. Требования: 1. Логика чтения/записи реализованная в методах save/load должна работать корректно в случае, если список assets пустой. 2. Логика чтения/записи реализованная в методах save/load должна работать корректно в случае, если поле name и список assets не пустые. 3. Класс Solution.Human должен быть публичным. */
public class Solution {
    public static void main(String[] args) {
        //todo исправьте outputStream/inputStream в соответствии с путем к вашему реальному файлу
        try {
            File your_file_name = File.createTempFile("your_file_name", null);
            System.out.println(your_file_name.getAbsolutePath());
            OutputStream outputStream = new FileOutputStream(your_file_name);
            InputStream inputStream = new FileInputStream(your_file_name);

            Human ivanov = new Human("Ivanov", new Asset("home", 999_999.99), new Asset("car", 2999.99));
            ivanov.save(outputStream);
            outputStream.flush();

            Human somePerson = new Human();
            somePerson.load(inputStream);
            inputStream.close();
            //todo проверьте тут, что ivanov и somePerson равны
            if (ivanov.equals(somePerson)){System.out.println("true");}
            else{System.out.println("false");}


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

    public static class Human {
        public String name;
        public List<Asset> assets = new ArrayList<>();

        public Human() {
        }

        public Human(String name, Asset... assets) {
            this.name = name;
            if (assets != null) {
                this.assets.addAll(Arrays.asList(assets));
            }
        }
        public void save(OutputStream outputStream) throws Exception { //из объекта в файл
            //todo реализуйте этот метод
            PrintWriter writer = new PrintWriter(outputStream);
            writer.print(name+",");
            System.out.println("#1 " + name);
            if (assets.size()>0){
                for (int i = 0; i < assets.size(); i++) {
                    Asset a = assets.get(i);
                    writer.print(a.getName() + ",");
                    System.out.println("#2 " + a.getName());
                    writer.print(a.getPrice());
                    System.out.println("#3 " + a.getPrice());
                    if (i != assets.size()-1){
                        writer.print(",");
                    }
                }
            }else {
                System.out.println();
            }
            writer.flush();

        }
        //todo Логика чтения/записи реализованная в методах save/load должна работать корректно в случае, если поле name и список assets не пустые.

        public void load(InputStream inputStream) throws Exception {
            //todo реализуйте этот метод
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            while (reader.ready()){
                String[] strs = reader.readLine().split(",");
                name = strs[0];
                System.out.println("1" + name);
                Human person = new Human(name);
                for (int i = 1; i <strs.length ; i+=2) {
                    System.out.println("2 " + strs[i]);
                    System.out.println("3 " + strs[i+1]);
                    Asset ass = new Asset(strs[i], Double.parseDouble(strs[i+1])); //todo ошибка
                    person.assets.add(ass);
                }
            }
            inputStream.close();
        }

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

            Human human = (Human) o;

            if (name != null ? !name.equals(human.name) : human.name != null) return false;
            return assets != null ? assets.equals(human.assets) : human.assets == null;
        }

        @Override
        public int hashCode() {
            int result = name != null ? name.hashCode() : 0;
            result = 31 * result + (assets != null ? assets.hashCode() : 0);
            return result;
        }
    }
}