<?php
use \bitco\logic;

require_once ('db.php');
require_once ('../model/Task.php');
require_once ('../model/Response.php');
require_once ('../class/logic.php');

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

function generateRandomString($length = 10) {
    return substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)))),1,$length);
}

try {
    $readDB = DB::connectReadDB();
} catch (PDOException $ex) {
    $response = new Response();
    $response->setSuccesss(false);
    $response->sethttpStatusCode(500);
    $response->addMessage("Database connection error");
    $response->addMessage($ex->getMessage());
    $response->send();
    exit();
}

if(!isset($_SERVER['HTTP_AUTHORIZATION']) || strlen($_SERVER['HTTP_AUTHORIZATION']) < 1) {
    $response = new Response();
    $response->setSuccesss(false);
    $response->sethttpStatusCode(401);
    (!isset($_SERVER['HTTP_AUTHORIZATION']) ? $response->addMessage('Access Token is missing from the header') : false);
    (strlen($_SERVER['HTTP_AUTHORIZATION']) < 1 ? $response->addMessage('Access token cannot be blank') : false);
    $response->send();
    exit();
}

$accesstoken = $_SERVER['HTTP_AUTHORIZATION'];
if ($accesstoken !== 'NDUzY2RlYzFhMWRhNTAU9xZDhhYzI0YTA5MTcTA3NTE2OA==') {
    $response = new Response();
    $response->setSuccesss(false);
    $response->sethttpStatusCode(400);
    $response->addMessage("Invalid Access Token");
    $response->send();
    exit();
}

if (empty($_POST) && $_SERVER['REQUEST_METHOD'] == 'POST') {
    try {
        $query = $readDB->prepare("
            SELECT DISTINCT
                productCode short_desc,
                products.name 'description',
                ma.customerName AS 'location',
                products.name 'products_name',
                service_accounts.username 'sub_account',
                contracts.startDate AS 'start_date',
                contracts.endDate AS 'end_date',
                contracts.priceExcl 'charge',
                contracts.costPriceExcl 'NRC',
                CASE
                    WHEN contracts.endDate is null THEN 'Active'
                    ELSE 'Expired'
                END 'Account_Status',
                service_instances.username 'service_tag',
                contracts.id 'identifier',
                contracts.masterAccountId
            FROM contracts
            LEFT JOIN products ON contracts.productId = products.id
            LEFT JOIN master_accounts ma ON contracts.masterAccountId = ma.id
            LEFT JOIN people pe ON pe.masterAccountId = ma.id
            LEFT JOIN master_accounts ma3 ON ma.billingMasterAccountId = ma3.id
            LEFT JOIN service_accounts ON contracts.serviceAccountId = service_accounts.id
            LEFT JOIN service_instances ON service_accounts.id = service_instances.serviceAccountId
            LEFT JOIN people p ON ma.primaryContact = p.id
            LEFT JOIN addresses ad ON ad.masterAccountId = ma.id
            WHERE contracts.endDate is null
        ");

        $query->execute();
        $rowCount = 0;
        $updateCount = 0;
        
        while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
            $systemId = 2; // Link Africa / O2CAP
            $short_desc = $row['short_desc'] ?? NULL;
            $description = $row['description'] ?? NULL;
            $products_name = $row['products_name'] ?? NULL;
            $sub_account = $row['sub_account'] ?? NULL;
            $start_date = $row['start_date'] ?? NULL;
            $end_date = $row['end_date'] ?? NULL;
            $charge = $row['charge'] ?? NULL;
            $NRC = $row['NRC'] ?? NULL;
            $Account_Status = $row['Account_Status'] ?? NULL;
            $service_tag = $row['service_tag'] ?? NULL;
            $identifier = $row['identifier'] ?? NULL;
            $masterAccountId = $row['masterAccountId'] ?? NULL;

            $obj = new logic();
            
            $loc = $obj->lookup_Location($masterAccountId, $systemId);
            $service = $obj->lookup_Service_by_subaccount($sub_account, $systemId, $service_tag);
            
            $serviceid = $service->id ?? 0;
            $sub_accountid = NULL;
            $locationid = $loc->id ?? 0;
            $location = $loc->name ?? '';

            $flag = $obj->check_contract_new($sub_account, $systemId, $service_tag);
            $uniqid_key = uniqid('la_') . generateRandomString(6);

            if ($flag == 0) {
                $obj->add_contract($serviceid, $sub_accountid, $locationid, $uniqid_key, $systemId, 
                                  $short_desc, $description, $location, $products_name, $sub_account, 
                                  $start_date, $end_date, $charge, $NRC, $Account_Status, 
                                  $service_tag, $identifier, $masterAccountId);
                $rowCount++;
            } else {
                // Update existing contract with NRC
                $obj->update_contract($systemId, $sub_account, $end_date, $Account_Status, $masterAccountId, $NRC);
                $updateCount++;
            }
        }

        $ob = new logic();
        $ob->update_contract_systemId_LA();
        
        $response = new Response();
        $response->setSuccesss(true);
        $response->sethttpStatusCode(200);
        $response->addMessage("Inserted: " . $rowCount . " records");
        $response->addMessage("Updated: " . $updateCount . " records");
        $response->addMessage('O2CAP Solid: Action Successfully Completed');
        $response->send();
        exit();

    } catch (PDOException $ex) {
        $response = new Response();
        $response->setSuccesss(false);
        $response->sethttpStatusCode(500);
        $response->addMessage($ex->getMessage());
        $response->send();
        exit();
    }
} else {
    $response = new Response();
    $response->setSuccesss(false);
    $response->sethttpStatusCode(404);
    $response->addMessage("Endpoint not found");
    $response->send();
}
