<!-- Realisatsiooni aluseks on võetud:
PHP Object Oriented CRUD Example with Bootstrap
Kasutatud 6.04.2016
https://www.codeofaninja.com/2014/06/php-object-oriented-crud-example-oop.html
-->
<?php
/*
======================
Hinnatava eseme klass
======================
*/
class Pakkumine
{
    
    private $conn;
    private $tabel = "pakkumised";
    
    public $id;
    public $oksjoni_id;
    public $kasutaja_id;
    public $summa;
    public $aeg;
    public $alghind;
    public $hetkehind;
    public $hetkepakkumine;
    public $pakkumine;
    public $automaatpakkumine;
    public $pakkumisteArv;
    public $automaat = 0;
    
    public function __construct($db)
    {
        $this->conn = $db;
    }
    
    
    function juhtivPakkuja()
    {
        // Kes juhib käesolevat oksjonit? Pärime kasutaja ID.
        $query = "SELECT kasutaja_id FROM " . $this->tabel . " WHERE oksjoni_id= ? AND automaat = 1 ORDER BY summa DESC LIMIT 1";
        $stmt  = $this->conn->prepare($query);
        $stmt->bindParam(1, $this->oksjoni_id);
        $stmt->execute();
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        return $row['kasutaja_id'];
    }
    
    function eelminePakkuja()
    {
        // Kes juhib käesolevat oksjonit? Pärime kasutaja ID.
        $query = "SELECT kasutaja_id FROM " . $this->tabel . " WHERE oksjoni_id= ? ORDER BY summa DESC LIMIT 1";
        $stmt  = $this->conn->prepare($query);
        $stmt->bindParam(1, $this->oksjoni_id);
        $stmt->execute();
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        return $row['kasutaja_id'];
    }
    
    function automaadiSuurus()
    {
        // Pärime kasutaja eelneva automaadi suuruse.
        $query = "SELECT summa FROM " . $this->tabel . " WHERE oksjoni_id= ? ORDER BY summa DESC LIMIT 1";
        $stmt  = $this->conn->prepare($query);
        $stmt->bindParam(1, $this->oksjoni_id);
        $stmt->execute();
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        return $row['summa'];
    }
    
    function suurendaAutomaatpakkumist()
    {
        // Loome uue pakkumise, tõstame pakkumiste arvu.
        $query = "INSERT INTO " . $this->tabel . " SET oksjoni_id= ?, kasutaja_id= ?, summa= ?, automaat = 1, aeg= ?;
        UPDATE oksjonid SET pakkumised= ? WHERE id = ?";
        
        $stmt = $this->conn->prepare($query);
        $stmt->bindParam(1, $this->oksjoni_id);
        $stmt->bindParam(2, $this->kasutaja_id);
        $stmt->bindParam(3, $this->pakkumine);
        $stmt->bindParam(4, $this->aeg);
        $stmt->bindParam(5, $this->pakkumisteArv);
        $stmt->bindParam(6, $this->oksjoni_id);
        
        $stmt->execute();
        
    }
    
    function automaatpakkumiseCheck()
    {
        // Kas oksjonil leidub automaatpakkumine?
        $query = "SELECT summa, kasutaja_id FROM " . $this->tabel . " WHERE oksjoni_id= ? AND summa > " . $this->hetkehind . " ORDER BY summa DESC LIMIT 1";
        
        $stmt = $this->conn->prepare($query);
        $stmt->bindParam(1, $this->oksjoni_id);
        $stmt->execute();
        $row               = $stmt->fetch(PDO::FETCH_ASSOC);
        $automaatpakkumine = $row['summa'];
        
        if ($automaatpakkumine != null) {
            $this->automaatpakkumine = $automaatpakkumine;
            return true;
        } else {
            return false;
        }
    }
    
    function suurendaSammu($algsumma)
    {
        // Suurendame summat ühe sammu võrra.
        if ($algsumma < 10) {
            return $algsumma + 1;
        } elseif ($algsumma < 50) {
            return $algsumma + 2;
        } elseif ($algsumma < 100) {
            return $algsumma + 5;
        } elseif ($algsumma < 500) {
            return $algsumma + 10;
        } elseif ($algsumma < 5000) {
            return $algsumma + 50;
        } elseif ($algsumma >= 5000) {
            return $algsumma + 100;
        }
    }
    
    function returnSamm($algsumma)
    {
        // Tagastame sammu vastavalt summale.
        if ($algsumma < 10) {
            return 1;
        } elseif ($algsumma < 50) {
            return 2;
        } elseif ($algsumma < 100) {
            return 5;
        } elseif ($algsumma < 500) {
            return 10;
        } elseif ($algsumma < 5000) {
            return 50;
        } else {
            return 100;
        }
    }

    function returnSammTagasi($algsumma)
    {
        // Tagastame sammu tagasi
        if ($algsumma == 10){
            return 1;
        } elseif ($algsumma == 50){
            return 2;
        }elseif ($algsumma == 100){
            return 5;
        }elseif ($algsumma == 500){
            return 10;
        }elseif ($algsumma == 5000){
            return 50;
        }elseif ($algsumma < 10) {
            return 1;
        } elseif ($algsumma < 50) {
            return 2;
        } elseif ($algsumma < 100) {
            return 5;
        } elseif ($algsumma < 500) {
            return 10;
        } elseif ($algsumma < 5000) {
            return 50;
        } else {
            return 100;
        }
    }
    
    function vastabSammule($pakkumine)
    {
        // Kas tehtav pakkumine on kooskõlas pakkumise sammudega?
        if ($pakkumine < 10) {
            return true;
        } elseif ($pakkumine < 50) {
            if ($pakkumine % 2 != 0) {
                return false;
            } else {
                return true;
            }
        } elseif ($pakkumine < 100) {
            if ($pakkumine % 5 != 0) {
                return false;
            } else {
                return true;
            }
        } elseif ($pakkumine < 500) {
            if ($pakkumine % 10 != 0) {
                return false;
            } else {
                return true;
            }
        } elseif ($pakkumine < 5000) {
            if ($pakkumine % 50 != 0) {
                return false;
            } else {
                return true;
            }
        } elseif ($pakkumine >= 5000) {
            if ($pakkumine % 100 != 0) {
                return false;
            } else {
                return true;
            }
        }
    }
    
    function suurendaSammSammult($hetkehind, $pakkumine, $automaatpakkumine)
    {
        // Automaatpakkumine versus automaatpakkumine
        if ($pakkumine < $automaatpakkumine) {
            if ($pakkumine == ($hetkehind + $this->returnSamm($this->hetkehind))) {
                //Pakkumine on ühe sammu võrra kõrgem hetkehinnast. Eesmärgiks ei ole automaatpakkumine.
                $this->hetkehind += $this->returnSamm($this->hetkehind);
                $this->kasutaja_id = $_SESSION['userSession'];
                $this->automaat    = 0;
                $this->pakkumine   = $this->hetkehind;
                $this->sooritaPakkumine();
            } else {
                // Tehtud pakkumine on madalam olemasolevast automaatpakkumisest.
                while ($this->hetkehind != ($pakkumine - $this->returnSammTagasi($pakkumine))) {
                    $this->hetkehind = $this->suurendaSammu($this->hetkehind);
                    $this->kasutaja_id = $this->juhtivPakkuja();
                    $this->automaat    = 2;
                    $this->pakkumine   = $this->hetkehind;
                    $this->sooritaPakkumine();
                }

                $this->hetkehind = $this->suurendaSammu($this->hetkehind);
                $this->kasutaja_id = $_SESSION['userSession'];

                $this->automaat    = 0;
                $this->pakkumine   = $this->hetkehind;
                $this->sooritaPakkumine();
            }
            $this->automaat = 2;
            $this->hetkehind = $this->suurendaSammu($this->hetkehind);
            $this->kasutaja_id = $this->juhtivPakkuja();
            $this->pakkumine   = $this->hetkehind;
            $this->sooritaPakkumine();
            
            echo "<div class=\"alert alert-danger alert-dismissable\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">&times;</button>Teid on üle pakutud automaatpakkumise poolt.</div>";
            
        } else if ($pakkumine > $automaatpakkumine) {
            // Tehtud pakkumine ületab automaatpakkumist.
            while ($this->hetkehind != ($automaatpakkumine - $this->returnSammTagasi($pakkumine))) {
                $this->hetkehind = $this->suurendaSammu($this->hetkehind);
                $this->kasutaja_id = $this->juhtivPakkuja();
                $this->automaat    = 2;
                $this->pakkumine   = $this->hetkehind;
                $this->sooritaPakkumine();
            }

            
            $this->hetkehind = $this->suurendaSammu($this->hetkehind);
            $this->kasutaja_id = $this->juhtivPakkuja();
            $this->automaat    = 2;
            $this->pakkumine   = $this->hetkehind;
            $this->sooritaPakkumine();

            // Tavapakkumine jääb peale.
            $this->hetkehind = $this->suurendaSammu($this->hetkehind);
            
            if ($this->summa > ($this->suurendaSammu($this->hetkehind))) {
                // Pakkumine seab ühtlasi ka uue automaadi.
                $this->automaat    = 0;
                $this->pakkumine   = $this->hetkehind;
                $this->kasutaja_id = $_SESSION['userSession'];
                $this->sooritaPakkumine();
                $this->pakkumisteArv -= 1;
                
                $this->automaat    = 1;
                $this->pakkumine   = $this->summa;
                $this->kasutaja_id = $_SESSION['userSession'];
                $this->sooritaPakkumine();
            } else {
                // Tavapakkumine jääb juhtima, aga uut automaati ei seata.
                $this->automaat    = 0;
                $this->pakkumine   = $this->hetkehind;
                $this->kasutaja_id = $_SESSION['userSession'];
                $this->sooritaPakkumine();
            }
            echo "<div class=\"alert alert-success alert-dismissable\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">&times;</button>Teie pakkumine oli edukas.</div>";
        } else {
            // Võrdne pakkumine automaatpakkumisega.
            while ($this->hetkehind != ($automaatpakkumine - $this->returnSammTagasi($pakkumine))) {
                $this->hetkehind = $this->suurendaSammu($this->hetkehind);
                $this->kasutaja_id = $_SESSION['userSession'];
                $this->automaat    = 2;
                $this->pakkumine   = $this->hetkehind;
                $this->sooritaPakkumine();
            }
            $this->hetkehind = $this->suurendaSammu($this->hetkehind);
            $this->kasutaja_id = $_SESSION['userSession'];
            $this->automaat    = 0;
            $this->pakkumine   = $this->hetkehind;
            $this->sooritaPakkumine();
            // Esimesena automaatpakkumise sooritanud kasutaja jääb juhtivaks.
            $this->automaat    = 2;
            $this->kasutaja_id = $this->juhtivPakkuja();
            $this->pakkumine   = $this->hetkehind;
            $this->sooritaPakkumine();
            echo "<div class=\"alert alert-danger alert-dismissable\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">&times;</button>Teid on üle pakutud automaatpakkumise poolt.</div>";
        }
    }
    
    function sooritaPakkumine()
    {
        // Lisame pakkumise andmebaasi
        $query = "INSERT INTO pakkumised SET oksjoni_id= ?, kasutaja_id= ?, summa= ?, automaat= ?, aeg= ?;
        UPDATE oksjonid SET hetkehind= ?, pakkumised= ? WHERE id = ?";
        
        $stmt = $this->conn->prepare($query);
        $this->pakkumisteArv += 1;
        $stmt->bindParam(1, $this->oksjoni_id);
        $stmt->bindParam(2, $this->kasutaja_id);
        $stmt->bindParam(3, $this->pakkumine);
        $stmt->bindParam(4, $this->automaat);
        $stmt->bindParam(5, $this->aeg);
        $stmt->bindParam(6, $this->hetkehind);
        $stmt->bindParam(7, $this->pakkumisteArv);
        $stmt->bindParam(8, $this->oksjoni_id);
        
        $stmt->execute();
    }
    
    // Funktsioon pakkumise edastamiseks.
    function create()
    {
        // POST väärtuste salvestamine.
        $this->oksjoni_id  = htmlspecialchars(strip_tags($this->oksjoni_id));
        $this->kasutaja_id = htmlspecialchars(strip_tags($this->kasutaja_id));
        $this->pakkumine   = htmlspecialchars(strip_tags($this->summa));
        $this->aeg         = htmlspecialchars(strip_tags($this->aeg));
        
        // Pärime oksjoni hetkehinna.
        $query_hetkehind = "SELECT alghind, hetkehind, pakkumised FROM oksjonid WHERE id = ?";
        $stmt_hetkehind  = $this->conn->prepare($query_hetkehind);
        $stmt_hetkehind->bindParam(1, $this->oksjoni_id);
        $stmt_hetkehind->execute();
        
        $row                 = $stmt_hetkehind->fetch(PDO::FETCH_ASSOC);
        $this->alghind       = $row['alghind'];
        $this->hetkehind     = $row['hetkehind'];
        $this->pakkumisteArv = $row['pakkumised'];
        
        if ($this->vastabSammule($this->pakkumine)) {
            // Kas leidub eelnevaid pakkumisi?
            if ($this->pakkumisteArv > 0) {
                // Leidub eelnevaid pakkumisi.
                // Kas praegune pakkuja juhib eelneva pakkumisega antud oksjonit?
                if ($this->eelminePakkuja() == $this->kasutaja_id) {
                    // Kasutaja on ühtlasi viimane pakkuja.
                    if ($this->automaadiSuurus() < $this->pakkumine) {
                        // Pakkumine ületab automaatpakkumist.
                        // Suurendame automaatpakkumist.
                        $this->suurendaAutomaatpakkumist();
                        echo "<div class=\"alert alert-success alert-dismissable\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">&times;</button>Automaatpakkumise piir edukalt tõstetud.</div>";
                    } else {
                        // Eksisteerib sama kasutaja võrdne või kõrgem automaatpakkumine.
                        
                        if ($this->readAutomaatStatus() == 0) {
                            echo "<div class=\"alert alert-danger alert-dismissable\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">&times;</button>Teil juba eksisteerib kõrgem eelpakkumine.</div>";
                        } else {
                            echo "<div class=\"alert alert-danger alert-dismissable\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">&times;</button>Teil eksisteerib juba kõrgema piiriga automaatpakkumine.</div>";
                        }
                    }

                } else {
                    // Kasutaja ei sooritanud eelmist pakkumist.
                    // Kas pakkumine on hetkehinnast sammu võrra suurem?
                    if ($this->summa >= $this->suurendaSammu($this->hetkehind)) {
                        
                        // Kas leidub automaatpakkumine?
                        if ($this->automaatpakkumiseCheck()) {

                            $this->suurendaSammSammult($this->hetkehind, $this->summa, $this->automaatpakkumine);
                        } 
                        else {
                            // Automaatpakkumist ei leitud.
                            if ($this->summa == ($this->suurendaSammu($this->hetkehind))) {
                                $this->hetkehind = $this->suurendaSammu($this->hetkehind);
                                $this->pakkumine = $this->summa;
                                $this->automaat  = 0;
                                $this->sooritaPakkumine();
                                
                            } else {
                                $this->pakkumine = $this->summa;
                                $this->automaat  = 1;
                                $this->sooritaPakkumine();
                                $this->pakkumisteArv -= 1;
                                
                                $this->hetkehind = $this->suurendaSammu($this->hetkehind);
                                $this->pakkumine = $this->hetkehind;
                                $this->automaat  = 0;
                                $this->sooritaPakkumine();
                            }
                            echo "<div class=\"alert alert-success alert-dismissable\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">&times;</button>Teie pakkumine oli edukas.</div>";
                        }
                    } else {
                        echo "<div class=\"alert alert-danger alert-dismissable\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">&times;</button>Palun pakkuge vähemalt miinimumsumma.</div>";
                    }
                }

            } else {
                // Oksjonil ei leidu eelnevaid pakkumisi.
                // Kas pakkumine ületab hetkehinna?
                if ($this->summa > $this->hetkehind) {
                    // Pakkumine ületab hetkehinna, järelikult on automaadi seadmine.
                    $this->automaat       = 0;
                    $kaikuminev_pakkumine = $this->alghind;
                    $seatav_automaat      = $this->summa;
                    
                    $this->hetkehind = $kaikuminev_pakkumine;
                    $this->pakkumine = $kaikuminev_pakkumine;
                    $this->sooritaPakkumine();
                    $this->pakkumisteArv -= 1;
                    
                    $this->automaat  = 1;
                    $this->pakkumine = $seatav_automaat;
                    $this->sooritaPakkumine();
                    
                    echo "<div class=\"alert alert-success alert-dismissable\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">&times;</button>Teie pakkumine oli edukas.</div>";
                } else {
                    // Kas pakkumine on võrdne hetkehinnaga?
                    if ($this->summa == $this->hetkehind) {
                        $this->pakkumine = $this->alghind;
                        $this->hetkehind = $this->pakkumine;
                        $this->sooritaPakkumine();
                        echo "<div class=\"alert alert-success alert-dismissable\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">&times;</button>Teie pakkumine oli edukas.</div>";
                    } else {
                        // Pakkumine on liiga madal.
                        echo "<div class=\"alert alert-danger alert-dismissable\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">&times;</button>Palun pakkuge vähemalt miinimumsumma.</div>";
                    }
                }
            }
        } else {
            // Pakkumine ei ole kooskõlas pakkumise sammudega.
            echo "<div class=\"alert alert-danger alert-dismissable\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">&times;</button>Teie pakkumine ei ole kooskõlas pakkumise sammudega.</div>";
        }
    }
    /* Pakkumise sammud:
    Summa [EUR]          Samm [EUR]
    1 - 10                1
    11 - 50               2
    51 - 100              5
    101 - 500             10
    501 - 5000            50
    alates 5000           100
    */
    
    // Pakkumised kasutaja ID järgi
    function readByUserID()
    {
        
        $query = "SELECT id, oksjoni_id, summa, aeg FROM " . $this->tabel . " WHERE kasutaja_id = ?";
        $stmt  = $this->conn->prepare($query);
        $stmt->bindParam(1, $this->kasutaja_id);
        $stmt->execute();
        
        return $stmt;
    }
    // Kõik pakkumised oksjoni ID järgi
    function readByAuctionID()
    {
        
        // select all query
        $query = "SELECT kasutaja_id, summa, automaat, aeg FROM " . $this->tabel . " WHERE oksjoni_id = ? ORDER BY id DESC";
        
        $stmt = $this->conn->prepare($query);
        $stmt->bindParam(1, $this->oksjoni_id);
        $stmt->execute();
        
        return $stmt;
    }
    
    function readAutomaatStatus()
    {
        // Automaatpakkumise staatuse lugemine
        $query = "SELECT automaat FROM " . $this->tabel . " WHERE oksjoni_id = ? and kasutaja_id = ? ORDER BY id DESC";
        
        $stmt = $this->conn->prepare($query);
        $stmt->bindParam(1, $this->oksjoni_id);
        $stmt->bindParam(2, $this->kasutaja_id);
        $stmt->execute();
        
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        
        return $row['automaat'];
    }
    
}