<?php

declare(strict_types=1);

namespace prj\mockup\models\app;

class home_model {
    private $dbh;
    private $name_demo_table = "test_names";
    private $db_helper;
        
    public function __construct($dbh) {
//        \tts\exceptions\DB_Exception::$error_message = "Home Model Error";
        $this->dbh = $dbh;
        $this->db_helper = new \tts\database\help_save($this->dbh, $this->name_demo_table);
    }
    
    public function is_valid(array $data): bool {
        return \tts\database\help_load::is_valid($data);
    }
    
    public function pre_save(): bool {
        $missing = $this->db_helper->get_missing();
        if (count($missing)) {
            echo "Required fields not set " . implode(",", $missing) . "!";
            return false;
        }
        
        if ($this->db_helper->dump_diff()) {
            return false; // Opps forgot a field!
        }
        return true;
    }
    
    public function init_name_demo_table(): void {
        $create_table_sql = "CREATE TABLE IF NOT EXISTS `{$this->name_demo_table}`(
                `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
                `first_name` TEXT,
                `last_name` TEXT,
                `age` INTEGER
        )";
      try {
        $this->dbh->query($create_table_sql);
      } catch (\PDOException $e) {
        echo \tts\exceptions\DB_Exception::customMessage($e, "Unable to make table!");
      }  
    }
    
    public function populate($rows): void {
        $dummy = new \tts\database\dummy_data($this->dbh);
        $data = [ 'first_name' => \tts\arrays\mocking\rnd_names::get_first_names(),
                  'last_name' => \tts\arrays\mocking\rnd_names::get_last_names(),
                  'age' => \tts\arrays\mocking\rnd_names::mock_age() ];
      try {  
        $dummy->add_dummy_data($this->name_demo_table, $rows, $data);
      } catch (\PDOException $e) {
        echo \tts\exceptions\DB_Exception::customMessage($e, "Unable to populate table!");
      }
    }

    public function get_member(string $member): ?string {
        return $this->db_helper->get_member($member);
    }
    
    public function save_new_user(array $input): bool {
        $set = $this->db_helper->set_members_by_array($input);
        if ($set === false) {
            return false; // Found Validation issues in input
        }
      try {
        $status = $this->db_helper->save($this);
      } catch (\PDOException $e) {
        echo \tts\exceptions\DB_Exception::customMessage($e, "Unable to save changes!");
      }  
        if ($status === $this->db_helper::successful_save) {
            return true; // It saved
        }
        return false; // It did not save
    }
   
    public function get_users(int $number_of_users_to_get = 12): \Generator {
       if ($number_of_users_to_get === 0) {
            return \tts\database\help_load::empty_generator();
        }
      try {  
        $sql = "SELECT * FROM {$this->name_demo_table} LIMIT {$number_of_users_to_get}";
        $result = $this->dbh->query($sql);
        return \tts\database\help_load::fetch_lazy($result);
      } catch (\PDOException $e) {
        echo \tts\exceptions\DB_Exception::customMessage($e);
      }
    }
}