<?php

namespace App\Controllers;

use CodeIgniter\API\ResponseTrait;
use CodeIgniter\Controller;
use CodeIgniter\HTTP\CLIRequest;
use CodeIgniter\HTTP\IncomingRequest;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
use Exception;

/**
 * Class BaseController
 *
 * BaseController provides a convenient place for loading components
 * and performing functions that are needed by all your controllers.
 * Extend this class in any new controllers:
 *     class Home extends BaseController
 *
 * For security be sure to declare any new methods as protected or private.
 */
abstract class BaseController extends Controller
{
    /**
     * Instance of the main Request object.
     *
     * @var CLIRequest|IncomingRequest
     */
    protected $request;
    use ResponseTrait;
    /**
     * An array of helpers to be loaded automatically upon
     * class instantiation. These helpers will be available
     * to all other controllers that extend BaseController.
     *
     * @var list<string>
     */
    protected $db;
    private $con_name = 'digifi_db'; // 'wrench_blog';
    protected $helpers = [];

    /**
     * Be sure to declare properties for any property fetch you initialized.
     * The creation of dynamic property is deprecated in PHP 8.2.
     */
    // protected $session;

    /**
     * @return void
     */
    public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
    {
        // Do Not Edit This Line
        parent::initController($request, $response, $logger);

        // Preload any models, libraries, etc, here.

        // E.g.: $this->session = \Config\Services::session();

        try {
            $this->db = \Config\Database::connect($this->con_name);
        } catch (Exception $e) {
            echo 'Caught Data Connect Exception ::: ',  $e->getMessage(), "\n";
        }
    }

    protected function insert_db($table_name, $insert_data) : array{
        $row = [];
            $this->db->table($table_name)->insert($insert_data);

        $query = $this->db->query("SELECT * FROM $table_name ORDER BY id DESC LIMIT 1");
        $row   = $query->getRowArray();
       // echo $row->name;
     return $row;
    }

    protected function update_db($table_name, $update_data, $where_data) : array{
        $row = [];
      // bad  $this->db->table($table_name)->where('id', '=', $where_data)->update($update_data);
        $query = $this->db->query("SELECT * FROM $table_name ORDER BY id DESC LIMIT 1");
        $row   = $query->getRowArray();
        return $row;
    }

    public function APIcall($method, $url, $data) {
        //  $curl = curl_init();
        $curl = curl_init($url);
        switch ($method) {
            case "GET":
                $params2 = '';
                foreach($data as $key2=>$value2)
                    $params2 .= $key2.'='.$value2.'&';

                $params2 = trim($params2, '&');
                $url = $url.'?'.$params2;// add param to URL
                log_message('critical', "API URL FINAL =>".$url );
                //curl_setopt($curl, CURLOPT_FRESH_CONNECT, true);
                //curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
                //curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
                break;
            case "POST":
                curl_setopt($curl, CURLOPT_POST, 1);
                if ($data)
                    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
                break;
            case "PUT":
                curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT");
                if ($data)
                    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
                break;
        }

        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_HTTPHEADER, array(
            'APIKEY: RegisteredAPIkey',
            'Content-Type: application/json',
        ));

        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
        $result = curl_exec($curl);

        if(!$result) {
            echo("Connection failure!");
        }
        curl_close($curl);
        return json_decode($result, true);
    }

    public function randomPassword( $length = 8 )
    {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_-=+;:,.?";
        $length = rand(10, 16);
        $password = substr( str_shuffle(sha1(rand() . time()) . $chars ), 0, $length );
        return $password;
    }

    public function sendSMS($to_number,  $sms_message):string{
        $API_KEY ="TLYsgMTZBeasJHHimcWXG1QPHmjH7FPwnbKwiqTEwGCu6TrK0v13hCn8N6SYZp";
        $BASE_URL = "https://api.ng.termii.com";
        log_message('error', "SMS TO API---=>". $to_number);

        $curl = curl_init();

        $data = array(
            "to"=> $to_number,
			"from"=> "DigiFI",
			"sms"=>  $sms_message,
			"type"=> "plain",
			"channel"=> "generic",
			"api_key"=> $API_KEY,
           );
        $post_data = json_encode($data);
        curl_setopt_array($curl, array(
            CURLOPT_URL => 'https://termii.com/api/sms/send',
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => '',
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 0,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => 'GET',
            CURLOPT_POSTFIELDS => $post_data,
            CURLOPT_HTTPHEADER => array(
                'Content-Type: application/json'
            ),
        ));

        $response = curl_exec($curl);
        log_message('error', "SMS TO API Response---=>". $response);
        curl_close($curl);
        return $response;
    }

    public function readCustomer($uid){
        $userUid = trim($uid);
        $mysql ="SELECT * from customers where uid::text ='".$userUid."'";
        $query = $this->db->query($mysql);
        return $query->getRowArray();
    }
}
