// 15_Objects.java - מחלקות ואובייקטים - OOP

public class Objects {
    public static void main(String[] args) {
        // יצירת אובייקטים
        Person p1 = new Person("דוד", 30);
        Person p2 = new Person("רחל", 25);

        // שימוש במתודות
        p1.greet();
        p2.greet();

        // הצגה דרך toString
        System.out.println("\n" + p1);
        System.out.println(p2);

        // שימוש ב-getters
        System.out.println("\nהגיל של " + p1.getName() + " הוא " + p1.getAge());

        // setter עם ולידציה
        p1.setAge(35);
        System.out.println("אחרי שינוי: " + p1);

        p1.setAge(-5);   // לא יקבל, יש ולידציה
        System.out.println("אחרי נסיון לא חוקי: " + p1);

        // עוד מחלקה - חשבון בנק
        BankAccount acc = new BankAccount("נפתלי", 1000);
        System.out.println("\n" + acc);

        acc.deposit(500);
        System.out.println("אחרי הפקדה: " + acc);

        acc.withdraw(200);
        System.out.println("אחרי משיכה: " + acc);

        acc.withdraw(10000);   // יותר מהיתרה - לא יבוצע
        System.out.println("אחרי נסיון משיכה גדולה: " + acc);

        // static - שייך למחלקה
        System.out.println("\nמספר חשבונות שנוצרו: " + BankAccount.getTotalAccounts());
    }
}

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void greet() {
        System.out.println("שלום, אני " + name + " בן " + age);
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age >= 0 && age <= 150) {
            this.age = age;
        }
    }

    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }
}

class BankAccount {
    private String owner;
    private double balance;
    private static int totalAccounts = 0;

    public BankAccount(String owner, double initialBalance) {
        this.owner = owner;
        this.balance = initialBalance;
        totalAccounts++;
    }

    public void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
        }
    }

    public void withdraw(double amount) {
        if (amount > 0 && amount <= balance) {
            balance -= amount;
        } else {
            System.out.println("משיכה נכשלה");
        }
    }

    public double getBalance() {
        return balance;
    }

    public static int getTotalAccounts() {
        return totalAccounts;
    }

    @Override
    public String toString() {
        return "BankAccount{owner='" + owner + "', balance=" + balance + "}";
    }
}
