<?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);

//$page =  $_GET['page'];
//$limitPerPage = 20;
//$offset = ($page == 1 ? 0 : ($limitPerPage*($page-1)));

//$num = 200;

//echo $offset;
//exit();

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();
}


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

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)){

    if  ($_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.quotedContractPriceExVat '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 /* Branch  */
                  LEFT JOIN master_accounts ma2 ON ma.parentMasterAccountId = ma2.id /* Master  */
                  LEFT JOIN master_accounts ma3 ON ma.billingMasterAccountId = ma3.id /* Billing  */
                  LEFT JOIN service_accounts ON contracts.serviceAccountId = service_accounts.id
                  LEFT JOIN service_instances ON service_accounts.id = service_instances.serviceAccountId
                  LEFT JOIN admin_users au ON ma2.accountManagerId = au.id
                  LEFT JOIN admin_users au2 ON ma2.salesManagerId = au2.id
                  LEFT JOIN admin_users au3 ON ma2.supportManagerId = au3.id
                  LEFT JOIN dealers d1 ON ma2.ownerDealerCodeId = d1.id
                  LEFT JOIN dealers d2 ON ma2.dealerCodeId = d2.id
                  LEFT JOIN select_options so ON ma2.accountTypeId = so.optionKey
                  LEFT JOIN master_accounts ma4 ON d1.masterAccountId = ma4.id  /* Dealer  */
                  left JOIN select_options so2 ON ma.statusId = so2.optionKey
                  WHERE  so.groupId = 18 and  so2.groupId = 17 and contracts.endDate is  null
                  ");

              $query->execute();

              $rowCount = $query->rowCount();

                $taskArray = [];
                  $rowCount = 0;
                  $updateCount = 0;
                  
                while ($row = $query->fetch(PDO::FETCH_ASSOC)){

                    $systemId = 1; // Solid Bitco
                    $short_desc = is_null($row['short_desc'])  ? NULL : $row['short_desc'];
                    $description = is_null($row['description'])  ? NULL : $row['description'];
                    //$location = is_null($row['location'])  ? NULL : $row['location'];
                    $products_name = is_null($row['products_name'])  ? NULL : $row['products_name'];
                    $sub_account = is_null($row['sub_account'])  ? NULL : $row['sub_account'];
                    $start_date = is_null($row['start_date'])  ? NULL : $row['start_date'];
                    $end_date = is_null($row['end_date'])  ? NULL : $row['end_date'];
                    $charge = is_null($row['charge'])  ? NULL : $row['charge'];
                    $NRC = is_null($row['NRC'])  ? NULL : $row['NRC'];
                    $Account_Status = is_null($row['Account_Status'])  ? NULL : $row['Account_Status'];
                    $service_tag = is_null($row['service_tag'])  ? NULL : $row['service_tag'];
                    $identifier = is_null($row['identifier'])  ? NULL : $row['identifier'];
                    $masterAccountId = is_null($row['masterAccountId'])  ? NULL : $row['masterAccountId'];

                    $obj = new logic();

                    $loc = $obj->lookup_Location($masterAccountId,$systemId);
                    $sub = $obj->lookup_Sub_account($masterAccountId,$systemId,$sub_account);
                    $service = $obj->lookup_Service($masterAccountId,$systemId,$service_tag);
                    $serviceid =  $service->id;

                    $sub_accountid =  $sub->id;

                    $locationid = $loc->id;
                    $location = $loc->name;

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

                    if ($flag == 0) {
                        // Insert new contract with NRC
                        $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 = $rowCount + 1;
                    } else {
                        // Update existing contract with NRC
                        $obj->update_contract ($systemId,$sub_account,$end_date,$Account_Status,$masterAccountId,$NRC);
                        $updateCount = $updateCount + 1;
                    }
                }

                $ob = new logic();
                $ob->update_contract_systemId_bitco();
                
                $response = new Response();
                $response->setSuccesss(true);
                $response->sethttpStatusCode(200);
                $response->addMessage((string) $rowCount . " record(s) inserted into central database.");
                $response->addMessage((string) $updateCount . " record(s) updated in central database.");
                $response->addMessage('BitCo Solid : Action Successfully Completed');
                $response->send();
                exit();

    } catch (PDOException $ex) {
      $response = new Response();
      $response->setSuccesss(false);
      $response->sethttpStatusCode(501);
      $response->addMessage($ex->getMessage());
      $response->send();
      exit();
    }

    } else {
        $response = new Response();
        $response->setSuccesss(false);
        $response->sethttpStatusCode(404);
        $response->addMessage("Request method not allowed");
        $response->send();
    }

} else {
  $response = new Response();
  $response->setSuccesss(false);
  $response->sethttpStatusCode(404);
  $response->addMessage("Endpoint not found");
  $response->send();
}
?>
