# Velmi rychle zaklady OOP

# Teorie dle:
# https://www.programiz.com/python-programming/object-oriented-programming
# https://ksvi.mff.cuni.cz/~dingle/2023-4/prog_1/notes_6.html

# objekty (atributy, metody, konstruktor), 
# instance (vytvoreni instanci, volani metod a pristup a zmena atributu  ), 
# encapsulation, inheritence, polymorfism

# System na zviratek
# Mame zviratka, kazde zviratko ma sve uid, vek a umi vydat zvuk (metoda voice())
# Mame konkretni zviratka typu Pes a typu Kocka. Pes i Kocka jsou zviratka
#
# Navrhnete vhodne objekty reprezentujici system pro zviratka.

# 1
# Definujte tridu Zvire majici:
# a) atribut uid (unikatni ID)
# b) konstruktor(uid)
# c) abstraktni metodu voice()

# 1.1
# vytvorte 2 instance objektu Zvire
# na obou instacich vypiste uid instance a zavolejte metodu voice()

# 2
# A od ni podedte dve tridy:
# a) Pes
# b) Kocka
# pro ne pretezte\implementujte metodu voice(),
# která vytiskne jejich hlas (Kocka "Mnau" a Pes "Haf") a uid instance

# 3
# Vytvorte
# a) 3 instance Kocky
# b) 2 instance Psů,
# ktere ulozite do listu

# 4
# List iterujte a zavolejte na vsech instacich objektů metodu voice()

# 5
# Ve for cyklu vytvorte list 100 Kocek
# a ve for cyklu ho projdete a zavolejte metodu voice()


class Animal:
    uid = ""
    vek = 0

    def __init__(self, uid, vek) -> None:
        self.uid = uid
        self.vek = vek

    def voice(self):
        print(
            f"Jsem objekt classy Animal nemam zadny svuj zvuk. Ale mam sve id: {self.uid}"
        )
        # pass


# tvorime instance classy Animal
animal_01 = Animal("rumprecht", 3)
print(animal_01)
animal_02 = Animal("adolf", 2)
print(animal_02)

# pristupujeme k aktributum a metodam objektu
print(animal_01.uid)
animal_01.voice()


class Cat(Animal):
    pocet_ulovenych_misi = 0

    def __init__(self, uid, vek) -> None:
        super().__init__(uid, vek)
        self.pocet_ulovenych_misi = 0

    def voice(self):
        print(f"Kočka uid: {self.uid} se hlasi do sluzby, Mňaou")

    # ulovi mys a zvysi pocitadlo ulovenych mysi o jedna
    def ulov_mys(self):
        self.pocet_ulovenych_misi += 1
        print(f"Lovim mys, ... mys ulovena! Celkem jsem ulovila {self.pocet_ulovenych_misi} mysi.")

    

class Dog(Animal):
    def __init__(self, uid, vek) -> None:
        super().__init__(uid, vek)

    def voice(self):
        print(f"Pes uid: {self.uid}, Haf")


c1 = Cat("006", 3)
c2 = Cat("007", 4)

d1 = Dog("003", 1)
d2 = Dog("001", 2)

c1.voice()
d2.voice()

l = [c1, c2, d1, d2]


for i in l:
    # print(i.uid)
    i.voice()

# or
# l = []
# l.append(Cat("009"))


# print(print("s"))


# Sto Kocek, vytvoreni instanci
l = []
for i in range(100):
    l.append(Cat(i, 2 * i))

# Sto Kocek zamnouka
for c in l:
    c.voice()


# Dva Psi jedna Kocka, vytvoreni instanci
l = []
for i in range(100):
    if i % 3 == 0:
        l.append(Cat(i, i))
    else:
        l.append(Dog(i, i))

import random

random.shuffle(l)

for c in l:
    c.voice()
