<?php

namespace Illuminate\Encryption;

use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Contracts\Encryption\Encrypter as EncrypterContract;
use Illuminate\Contracts\Encryption\EncryptException;
use Illuminate\Contracts\Encryption\StringEncrypter;
use RuntimeException;

class Encrypter implements EncrypterContract, StringEncrypter
{
    /**
     * The encryption key.
     *
     * @var string
     */
    protected $key;

    /**
     * The algorithm used for encryption.
     *
     * @var string
     */
    protected $cipher;

    /**
     * The supported cipher algorithms and their properties.
     *
     * @var array
     */
    private static $supportedCiphers = [
        'aes-128-cbc' => ['size' => 16, 'aead' => false],
        'aes-256-cbc' => ['size' => 32, 'aead' => false],
        'aes-128-gcm' => ['size' => 16, 'aead' => true],
        'aes-256-gcm' => ['size' => 32, 'aead' => true],
    ];

    /**
     * Create a new encrypter instance.
     *
     * @param  string  $key
     * @param  string  $cipher
     * @return void
     *
     * @throws \RuntimeException
     */
    public function __construct($key, $cipher = 'aes-128-cbc')
    {
        $key = (string) $key;

        if (! static::supported($key, $cipher)) {
            $ciphers = implode(', ', array_keys(self::$supportedCiphers));

            throw new RuntimeException("Unsupported cipher or incorrect key length. Supported ciphers are: {$ciphers}.");
        }

        $this->key = $key;
        $this->cipher = $cipher;
    }

    /**
     * Determine if the given key and cipher combination is valid.
     *
     * @param  string  $key
     * @param  string  $cipher
     * @return bool
     */
    public static function supported($key, $cipher)
    {
        if (! isset(self::$supportedCiphers[strtolower($cipher)])) {
            return false;
        }

        return mb_strlen($key, '8bit') === self::$supportedCiphers[strtolower($cipher)]['size'];
    }

    /**
     * Create a new encryption key for the given cipher.
     *
     * @param  string  $cipher
     * @return string
     */
    public static function generateKey($cipher)
    {
        return random_bytes(self::$supportedCiphers[strtolower($cipher)]['size'] ?? 32);
    }

    /**
     * Encrypt the given value.
     *
     * @param  mixed  $value
     * @param  bool  $serialize
     * @return string
     *
     * @throws \Illuminate\Contracts\Encryption\EncryptException
     */




    // very small encode function with 76 character for project
    public function encrypt_light($value,$tableKey, $serialize=true){
      
      $word ="";
      if($value != null){
      
        $valueArray = str_split($value);
        $char_one="";$num=0;$pairPlace="";
        $pairCount = count($valueArray);
        for ($i=0; $i <count($valueArray) ; $i++) {
          if($tableKey == "General"){
            switch ($valueArray[$i]) {

              case " " :
                $char_one = 94;

                break;
              case "A":
                $char_one = 13;

                break;
              case "B":
                $char_one = 29;

                break;
              case "C":
                $char_one = 20;

                break;
              case "D":
                $char_one = 15;

                break;
              case "E":
                $char_one = 26;

                break;
              case "F":
                $char_one = 25;

                break;
              case "G":
                $char_one = 22;

                break;
              case "H":
                $char_one = 23;

                break;
              case "I":
                $char_one = 27;

                break;
              case "J":
                $char_one = 17;

                break;
              case "K":
                $char_one = 31;

                break;
              case "L":
                $char_one = 34;

                break;
              case "M":
                $char_one = 19;

                break;
              case "N":
                $char_one = 37;

                break;
              case "O":
                $char_one = 16;

                break;
              case "P":
                $char_one = 24;

                break;
              case "Q":
                $char_one = 52;

                break;
              case "R":
                $char_one = 10;

                break;
              case "S":
                $char_one = 39;

                break;
              case "T":
                $char_one = 45;

                break;
              case "U":
                $char_one = 18;

                break;
              case "V":
                $char_one = 14;

                break;
              case "W":
                $char_one = 35;

                break;
              case "X":
                $char_one = 36;

                break;
              case "Y":
                $char_one = 28;

                break;
              case "Z":
                $char_one = 44;

                break;
              case "a":
                $char_one = 59;

                break;
              case "b":
                  $char_one = 30;

                  break;
              case "c":
                  $char_one = 49;

                  break;
              case "d":
                  $char_one = 48;

                  break;
              case "e":
                  $char_one = 32;

                  break;
              case "f":
                  $char_one = 38;

                  break;
              case "g":
                  $char_one = 46;

                  break;
              case "h":
                  $char_one = 84;

                  break;
              case "i":
                  $char_one = 86;

                  break;
              case "j":
                  $char_one = 33;

                  break;
              case "k":
                  $char_one = 71;

                  break;
              case "l":
                  $char_one = 97;

                  break;
              case "m":
                  $char_one = 92;

                  break;
              case "n":
                  $char_one = 68;

                  break;
              case "o":
                  $char_one = 89;

                  break;
              case "p":
                  $char_one = 69;

                  break;
              case "q":
                  $char_one = 93;

                  break;
              case "r":
                  $char_one = 98;

                  break;
              case "s":
                  $char_one = 53;

                  break;
              case "t":
                  $char_one = 70;

                  break;
              case "u":
                  $char_one = 79;

                  break;
              case "v":
                  $char_one = 82;

                  break;
              case "w":
                  $char_one = 58;

                  break;
              case "x":
                  $char_one = 95;

                  break;
              case "y":
                  $char_one = 40;

                  break;
              case "z":
                  $char_one = 50;

                  break;
              case "0":
                $char_one = 11;

                break;
              case "1":
                $char_one = 21;

                break;
              case "2":
                $char_one = 41;

                break;
              case "3":
                $char_one = 12;

                break;
              case "4":
                $char_one = 42;

                break;
              case "5":
                $char_one = 51;

                break;
              case "6":
                $char_one = 43;

                break;
              case "7":
                $char_one = 54;

                break;
              case "8":
                $char_one = 60;

                break;
              case "9":
                $char_one = 66;

                break;
              case "-":
                $char_one = 73;

                break;
              case "/":
                $char_one = 76;

                break;
              case ",":
                $char_one = 47;

                break;
              case ".":
                $char_one = 77;

                break;
              case ":":
                $char_one = 62;

                break;
              case '"':
                $char_one = 78;

                break;
              case "'":
                $char_one = 64;

                break;
              case "@":
                $char_one = 55;

                break;
              case "!":
                $char_one = 65;

                break;
              case "$":
                $char_one = 72;

                break;
              case "#":
                $char_one = 80;

                break;
              case "%":
                $char_one = 67;

                break;
              case "(":
                $char_one = 56;

                break;
              case ")":
                $char_one = 81;

                break;
              case ">":
                $char_one = 63;

                break;
              case "<":
                $char_one = 57;

                break;
              case "=":
                $char_one = 99;

                break;
                case "_":
                  $char_one = 61;

                  break;
                case "+":
                  $char_one = 83;
                  break;
              default:
            }
            $word .= $char_one;
          }
          if($tableKey == "Lab"){
            switch ($valueArray[$i]) {
              case "A":
                $char_one = 11;$num=2;
                break;
              case "B":
                $char_one = 24;$num=2;
                break;
              case "C":
                $char_one = 38;$num=2;
                break;
              case "D":
                $char_one = 14;$num=2;
                break;
              case "E":
                $char_one = 15;$num=2;
                break;
              case "F":
                $char_one = 29;$num=2;
                break;
              case "G":
                $char_one = 32;$num=2;
                break;
              case "H":
                $char_one = 21;$num=2;
                break;
              case "I":
                $char_one = 26;$num=2;
                break;
              case "J":
                $char_one = 31;$num=2;
                break;
              case "K":
                $char_one = 39;$num=2;
                break;
              case "L":
                $char_one = 13;$num=2;
                break;
              case "M":
                $char_one = 23;$num=2;
                break;
              case "N":
                $char_one = 34;$num=2;
                break;
              case "O":
                $char_one = 35;$num=2;
                break;
              case "P":
                $char_one = 36;$num=2;
                break;
              case "Q":
                $char_one = 41;$num=2;
                break;
              case "R":
                $char_one = 42;$num=2;
                break;
              case "S":
                $char_one = 37;$num=2;
                break;
              case "T":
                $char_one = 33;$num=2;
                break;
              case "U":
                $char_one = 10;$num=2;
                break;
              case "V":
                $char_one = 22;$num=2;
                break;
              case "W":
                $char_one = 20;$num=2;
                break;
              case "X":
                $char_one = 30;$num=2;
                break;
              case "Y":
                $char_one = 16;$num=2;
                break;
              case "Z":
                $char_one = 25;$num=2;
                break;
              case "a":
                  $char_one = 74;$num=2;
                  break;
              case "b":
                  $char_one = 62;$num=2;
                  break;
              case "c":
                  $char_one = 94;$num=2;
                  break;
              case "d":
                  $char_one = 45;$num=2;
                  break;
              case "e":
                  $char_one = 61;$num=2;
                  break;
              case "f":
                  $char_one = 83;$num=2;
                  break;
              case "g":
                  $char_one = 64;$num=2;
                  break;
              case "h":
                  $char_one = 50;$num=2;
                  break;
              case "i":
                  $char_one = 84;$num=2;
                  break;
              case "j":
                  $char_one = 51;$num=2;
                  break;
              case "k":
                  $char_one = 80;$num=2;
                  break;
              case "l":
                  $char_one = 88;$num=2;
                  break;
              case "m":
                  $char_one = 99;$num=2;
                  break;
              case "n":
                  $char_one = 70;$num=2;
                  break;
              case "o":
                  $char_one = 86;$num=2;
                  break;
              case "p":
                  $char_one = 92;$num=2;
                  break;
              case "q":
                  $char_one = 69;$num=2;
                  break;
              case "r":
                  $char_one = 59;$num=2;
                  break;
              case "s":
                  $char_one = 89;$num=2;
                  break;
              case "t":
                  $char_one = 66;$num=2;
                  break;
              case "u":
                  $char_one = 90;$num=2;
                  break;
              case "v":
                  $char_one = 81;$num=2;
                  break;
              case "w":
                  $char_one = 60;$num=2;
                  break;
              case "x":
                  $char_one = 82;$num=2;
                  break;
              case "y":
                  $char_one = 63;$num=2;
                  break;
              case "z":
                  $char_one = 58;$num=2;
                  break;
              case "0":
                $char_one = 140;$num=3;
                break;
              case "1":
                $char_one = 313;$num=3;
                break;
              case "2":
                $char_one = 252;$num=3;
                break;
              case "3":
                $char_one = 187;$num=3;
                break;
              case "4":
                $char_one = 367;$num=3;
                break;
              case "5":
                $char_one = 419;$num=3;
                break;
              case "6":
                $char_one = 448;$num=3;
                break;
              case "7":
                $char_one = 357;$num=3;
                break;
              case "8":
                $char_one = 350;$num=3;
                break;
              case "9":
                $char_one = 242;$num=3;
                break;
              case "-":
                $char_one = 812;$num=3;
                break;
              case "/":
                $char_one = 683;$num=3;
                break;
              case ",":
                $char_one = 572;$num=3;
                break;
              case ".":
                $char_one = 511;$num=3;
                break;
              case ":":
                $char_one = 850;$num=3;
                break;
              case '"':
                $char_one = 636;$num=3;
                break;
              case "'":
                $char_one = 553;$num=3;
                break;
              case "@":
                $char_one = 489;$num=3;
                break;
              case "!":
                $char_one = 864;$num=3;
                break;
              case "$":
                $char_one = 885;$num=3;
                break;
              case "#":
                $char_one = 816;$num=3;
                break;
              case "%":
                $char_one = 911;$num=3;
                break;
              case "(":
                $char_one = 914;$num=3;
                break;
              case ")":
                $char_one = 890;$num=3;
                break;
              case ">":
                $char_one = 703;$num=3;
                break;
              case "<":
                $char_one = 826;$num=3;
                break;
              default:
            }
            $word .= $char_one;
            $pairPlace .= $num;
          }
        }
        $word .=$pairCount;
      }else{
          $word = $value;
      }
      return $word;
    }

    private function switchLay_decrypt($cup,$tableKey){
      if($tableKey == "General"){
        
        if(isset($cup) && is_string($cup)){
          
          switch ($cup) {
            case 94:
              $char_one =" ";
              break;
            case 13:
              $char_one ="A";
              break;
            case 29:
              $char_one ="B" ;
              break;
            case 20:
              $char_one ="C" ;
              break;
            case 15:
              $char_one ="D" ;
              break;
            case 26:
              $char_one ="E";
              break;
            case 25:
              $char_one ="F" ;
              break;
            case 22:
              $char_one ="G" ;
              break;
            case 23:
              $char_one ="H" ;
              break;
            case 27:
              $char_one ="I" ;
              break;
            case 17:
              $char_one ="J" ;
              break;
            case 31:
              $char_one ="K" ;
              break;
            case 34:
              $char_one ="L" ;
              break;
            case 19:
              $char_one ="M" ;
              break;
            case 37:
              $char_one ="N" ;
              break;
            case 16:
              $char_one ="O" ;
              break;
            case 24:
              $char_one ="P" ;
              break;
            case 52:
              $char_one ="Q" ;
              break;
            case 10:
              $char_one ="R" ;
              break;
            case 39:
              $char_one ="S" ;
              break;
            case 45:
              $char_one ="T" ;
              break;
            case 18:
              $char_one ="U" ;
              break;
            case 14:
              $char_one ="V" ;
              break;
            case 35:
              $char_one ="W" ;
              break;
            case 36:
              $char_one ="X";
              break;
            case 28:
              $char_one ="Y" ;
              break;
            case 44:
              $char_one ="Z" ;
              break;
            case 59:
                $char_one ="a" ;
                break;
            case 30:
                $char_one ="b" ;
                break;
            case 49:
                $char_one ="c" ;
                break;
            case 48:
                $char_one ="d" ;
                break;
            case 32:
                $char_one ="e" ;
                break;
            case 38:
                $char_one ="f" ;
                break;
            case 46:
                $char_one ="g" ;
                break;
            case 84:
                $char_one ="h";
                break;
            case 86:
                $char_one ="i";
                break;
            case 33:
                $char_one ="j";
                break;
            case 71:
                $char_one ="k";
                break;
            case 97:
                $char_one ="l";
                break;
            case 92:
                $char_one ="m";
                break;
            case 68:
                $char_one ="n" ;
                break;
            case 89:
                $char_one ="o";
                break;
            case 69:
                $char_one ="p" ;
                break;
            case 93:
                $char_one ="q";
                break;
            case 98:
                $char_one = "r";
                break;
            case 53:
                $char_one ="s";
                break;
            case 70:
                $char_one ="t";
                break;
            case 79:
                $char_one ="u";
                break;
            case 82:
                $char_one ="v";
                break;
            case 58:
                $char_one ="w";
                break;
            case 95:
                $char_one ="x" ;
                break;
            case 40:
                $char_one ="y";
                break;
            case 50:
                $char_one ="z" ;
                break;
            case 11:
              $char_one ="0" ;
              break;
            case 21:
              $char_one ="1";
              break;
            case 41:
              $char_one ="2" ;
              break;
            case 12:
              $char_one ="3" ;
              break;
            case 42:
              $char_one ="4" ;
              break;
            case 51:
              $char_one ="5" ;
              break;
            case 43:
              $char_one ="6" ;
              break;
            case 54:
              $char_one ="7" ;
              break;
            case 60:
              $char_one ="8" ;
              break;
            case 66:
              $char_one ="9" ;
              break;
            case 73:
              $char_one ="-" ;
              break;
            case 76:
              $char_one ="/" ;
              break;
            case 47:
              $char_one ="," ;
              break;
            case 77:
              $char_one ="." ;
              break;
            case 61:
              $char_one ="_" ;
              break;
            case 62:
              $char_one =":" ;
              break;
            case 78:
              $char_one ='"' ;
              break;
            case 64:
              $char_one ="'";
              break;
            case 55:
              $char_one ="@" ;
              break;
            case 65:
              $char_one ="!" ;
              break;
            case 72:
              $char_one ="$" ;
              break;
            case 80:
              $char_one ="#";
              break;
            case 67:
              $char_one ="%" ;
              break;
            case 56:
              $char_one ="(" ;
              break;
            case 81:
              $char_one =")" ;
              break;
            case 83:
              $char_one ="+" ;
              break;
            case 63:
              $char_one =">";
              break;
            case 57:
              $char_one ="<" ;
              break;
            case 99:
              $char_one ="=" ;
              break;
            default:
              $char_one=NULL;
          }
      }else{
        $char_one ="";
      }
    }
      //$word .= $char_one;
      return $char_one;
    }

    // You can decrypt 48 characters from the text
    public function decrypt_light($value,$tableKey, $serialize=false){
      strval($value);
      
      $word ="";
      if(isset($value) && is_string($value) && !empty($value))
      {
        $valueArray = str_split($value);
        $lastCharacter = end($valueArray);

        $char_one="";
        $valueCount =count($valueArray);

        if($valueCount % 2 == 0)
          {
              //even
              $place1 = $valueCount-2;
              $place2 = $valueCount-1;
            //  $lastDigit =
              $lastDigit0 = strval($valueArray[$place1]);// last digit of the array to know how many pair have in an array
              $lastDigit1 = strval($valueArray[$place2]);// last digit of the array to know how many pair have in an array
              $lastDigit = intval($lastDigit0.$lastDigit1);

              // Get the second last character (before the last one)
              $secondLastChar = $valueCount - 1;
              // Check if the character is a number
              if (is_numeric($secondLastChar)) {
                $numberValue = (int)$secondLastChar; // Convert to integer
                // Calculate the modulo
                $dividedResult = (int)($numberValue / 2);
              }
              if($lastDigit != $dividedResult){// pair number != real pair
                //dd("Even",$lastDigit,$dividedResult);
                $lastDigit =0;
                $word = intval($value);
              }
          }
        else
         {
            //odd
            // Get the second last character (before the last one)
            $secondLastChar = $valueCount - 1;
            // Check if the character is a number
            if (is_numeric($secondLastChar)) {
              $numberValue = (int)$secondLastChar; // Convert to integer
              // Calculate the modulo
              $dividedResult = $numberValue / 2;
              //odd
              $pairNum = $valueCount-1;
              $lastDigit = intval($valueArray[$pairNum]);

              
              if(intval($lastCharacter) != $dividedResult){
                $lastDigit = 0;
                $word = intval($value);
              }
            }
          }


        for ($a=0; $a < $lastDigit; $a++) {
            $cup=0;
                if($a == 0){
                  for ($i=0; $i < 2; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);

                }
                if($a == 1){
                  for ($i=2; $i < 4; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 2){
                  for ($i=4; $i < 6; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 3){
                  for ($i=6; $i < 8; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 4){
                  for ($i=8; $i < 10; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 5){
                  for ($i=10; $i < 12; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 6){
                  for ($i=12; $i < 14; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 7){
                  for ($i=14; $i < 16; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 8){
                  for ($i=16; $i < 18; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 9){
                  for ($i=18; $i < 20; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }

                if($a == 10){
                  for ($i=20; $i < 22; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 11){
                  for ($i=22; $i < 24; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 12){
                  for ($i=24; $i < 26; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 13){
                  for ($i=26; $i < 28; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 14){
                  for ($i=28; $i < 30; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 15){
                  for ($i=30; $i < 32; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 16){
                  for ($i=32; $i < 34; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 17){
                  for ($i=34; $i < 36; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 18){
                  for ($i=36; $i < 38; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 19){
                  for ($i=38; $i < 40; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 20){
                  for ($i=40; $i < 42; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }

                if($a == 21){
                  for ($i=42; $i < 44; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 22){
                  for ($i=44; $i < 46; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 23){
                  for ($i=46; $i < 48; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 24){
                  for ($i=48; $i < 50; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 25){
                  for ($i=50; $i < 52; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 26){
                  for ($i=52; $i < 54; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 27){
                  for ($i=54; $i < 56; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 28){
                  for ($i=56; $i < 58; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 29){
                  for ($i=58; $i < 60; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 30){
                  for ($i=60; $i < 62; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }

                if($a == 31){
                  for ($i=62; $i < 64; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 32){
                  for ($i=64; $i < 66; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 33){
                  for ($i=66; $i < 68; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 34){
                  for ($i=68; $i < 70; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 35){
                  for ($i=70; $i < 72; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 36){
                  for ($i=72; $i < 74; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 37){
                  for ($i=74; $i < 76; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 38){
                  for ($i=76; $i < 78; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 39){
                  for ($i=78; $i < 80; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 40){
                  for ($i=80; $i < 82; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }

                if($a == 41){
                  for ($i=82; $i < 84; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 42){
                  for ($i=84; $i < 86; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 43){
                  for ($i=86; $i < 88; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 44){
                  for ($i=88; $i < 90; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 45){
                  for ($i=90; $i < 92; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 46){
                  for ($i=92; $i < 94; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 47){
                  for ($i=94; $i < 96; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }
                if($a == 48){
                  for ($i=96; $i < 98; $i++) {
                    $cup .= $valueArray[$i];
                  }
                  $word .= $this -> switchLay_decrypt($cup,$tableKey);
                }

        }
      }
      else
      {
        $word = NULL;
      }
      return $word;
    }



    public function codeBook($value,$tableKeyPar,$serialize=false){
      strval($value);$codeStr="";
      if($tableKeyPar=="encode"){
        switch ($value) {
        case 'TB Patient':
          $codeStr = "1";
          break;
        case 'Institutionalize':
          $codeStr = "2";
          break;
        case 'Uniformed Services Personnel':
          $codeStr = "3";
          break;
        case 'Migrant Population':
          $codeStr = "4";
          break;
        case 'Migrant population':
          $codeStr = "4";
          break;
        case 'FSW':
          $codeStr = "1.1";
          break;
        case 'FSW_PWID':
          $codeStr = "1.2";
          break;
        case 'FSW_PWUD':
          $codeStr = "1.3";
          break;
        case 'Client of FSW':
          $codeStr = "2.1";
          break;
        case 'Clients of FSW':
         $codeStr = "2.1";
          break;
        case 'MSM':
          $codeStr = "3.1";
          break;
        case 'MSM_PWID':
          $codeStr = "3.2";
          break;
        case 'MSM_PWUD':
          $codeStr = "3.3";
          break;
        case 'TG':
          $codeStr = "4.1";
          break;
        case 'TG_PWID':
          $codeStr = "4.2";
          break;
        case 'TG_PWUD':
          $codeStr = "4.3";
          break;
        case 'IDU':
          $codeStr = "5.1";
          break;
        case 'PWID':
          $codeStr = "5.1";
          break;
        case 'PWID_FSW':
          $codeStr = "5.2";
          break;
        case 'PWID_MSM':
          $codeStr = "5.3";
          break;
        
        case 'PWUD':
          $codeStr = "6.1";
          break;
        case 'Partner of KP':
          $codeStr = "7";
          break;
        case 'Partner of PWID':
          $codeStr = "7.1";
          break;
        case 'Partner of FSW':
          $codeStr = "7.2";
          break;
        case 'Female of MSM':
          $codeStr = "7.3";
          break;
        case 'Partner of PLHIV':
          $codeStr = "8";
          break;
        case 'Others':
          $codeStr = "9";
          break;
        case 'In-patient':
          $codeStr = "10";
          break;
        case 'Blood Donor':
          $codeStr = "11";
          break;
        // For Lab data
        case 'Reactive':
          $codeStr = "21";
          break;
        case 'Non Reactive':
          $codeStr = "22";
          break;
        case 'Invalid':
          $codeStr = "23";
          break;

        case 'Positive':
          $codeStr = "24";
          break;
        case 'Negative':
          $codeStr = "25";
          break;
        case 'Inconclusive':
          $codeStr = "26";
          break;
        case 'Nil':
          $codeStr = "27";
          break;
        case 'Yes':
          $codeStr = "28";
          break;
        case 'No':
          $codeStr = "29";
          break;

       // case 'phacheck':
       //   $codeStr = "41";
       //   break;
       // case 'artcheck':
      //    $codeStr = "42";
      //    break;
      //  case 'prepcheck':
      //    $codeStr = "43";
      //    break;
     //   case 'pmtctcheck':
     //     $codeStr = "44";
     //     break;
    //    case 'hivTBcheck':
    //      $codeStr = "45";
     //     break; 
          
                                                       
	case 'Special Groups':
          $codeStr = "12";
          break;           
        case 'Pregnant Mother':
          $codeStr = "13";
          break;           
        case 'Spouse of pregnant mother':
          $codeStr = "14";
          break;           
        case 'Exposed Children':
          $codeStr = "15";
          break;
        case 'Exposed children':
          $codeStr = "15";
          break;            
        case 'Low Risk':
          $codeStr = "16";
          break;
        case 'Low risk':
          $codeStr = "16";
          break;           
        case 'Youth(15-24)':
          $codeStr = "17";
          break;           
        case 'Other Low Risk':
          $codeStr = "18";
          break;           
        case 'PP':
          $codeStr = "15.1";
          break; 
        case 'pp':
          $codeStr = "15.1";
          break;           
        case 'MP':
          $codeStr = "15.2";
          break; 
        case 'mp':
          $codeStr = "15.2";
          break;
          
        default:
          $codeStr =$value;
          //$codeStr ="";
          break;
        }
      }
      return $codeStr;
    }
    public function switchCode($value,$tableKey){
      strval($value);
      
      if(is_string($value)){

        $code="";
       
        
          if($tableKey == "codeBook"){
            switch ($value) {

              case "TB Patient" :
                $code = 1;

                break;
              case "Institutionalized":
                $code = 2;

                break;
              case "Uniform Services":
                $code = 3;

                break;
              case "Migrant Population":
                $code = 4;

                break;
              case "FSW":
                $code = 1.1;

                break;
              case "FSW PWID":
                $code = 1.2;

                break;
              case "FSW PWUD":
                $code = 1.3;

                break;
              case "Client of FSW":
                $code = 2.1;

                break;
              case "MSM":
                $code = 3.1;

                break;
              case "MSM_PWID":
                $code = 3.2;

                break;
              case "MSM_PWUD":
                $code = 3.3;

                break;
              case "tg":
                $code = 4.1;

                break;
              case "TG_PWID":
                $code = 4.2;

                break;
              case "TG_PWUD":
                $code = 4.3;

                break;
              case "IDU":
                $code = 5.1;

                break;
              case "PWID_FSW":
                $code = 5.2;

                break;
              case "PWID_MSM":
                $code = 5.3;

                break;
              case "PWUD":
                $code = 6.1;

                break;
              case "pt_kp":
                $code = 7;

                break;
              case "Partner of PWID":
                $code = 7.1;

                break;
              case "Partner of FSW":
                $code = 7.2;

                break;
              case "Female of MSM":
                $code = 7.3;

                break;
              case "pt_kp_plhiv":
                $code = 8;

                break;
              case "W":
                $code = 24;

                break;
              case "X":
                $code = 25;

                break;
              case "Y":
                $code = 26;

                break;
              case "Z":
                $code = 27;

                break;
              case "a":
                $code = 28;

                break;
              case "b":
                  $code = 29;

                  break;
              case "c":
                  $code = 30;

                  break;
              case "d":
                  $code = 31;

                  break;
              case "e":
                  $code = 32;

                  break;
              case "f":
                  $code = 33;

                  break;
              case "g":
                  $code = 34;

                  break;
              case "h":
                  $code = 35;

                  break;
              case "i":
                  $code = 36;

                  break;
              case "j":
                  $code = 37;

                  break;
              case "k":
                  $code = 38;

                  break;
              case "l":
                  $code = 39;

                  break;
              case "m":
                  $code = 40;

                  break;
              case "n":
                  $code = 41;

                  break;
              case "o":
                  $code = 42;

                  break;
              case "p":
                  $code = 43;

                  break;
              case "q":
                  $code = 44;

                  break;
              case "r":
                  $code = 45;

                  break;
              case "s":
                  $code = 46;

                  break;
              case "t":
                  $code = 47;

                  break;
              case "u":
                  $code = 48;

                  break;
              case "v":
                  $code = 49;

                  break;
              case "w":
                  $code = 50;

                  break;
             
              default:
            }
            
          return $code;
          }

    }else{
      return $value;
    }
  }






    public function encrypt($value, $serialize = true)
    {
        $iv = random_bytes(openssl_cipher_iv_length(strtolower($this->cipher)));

        $tag = '';

        $value = self::$supportedCiphers[strtolower($this->cipher)]['aead']
            ? \openssl_encrypt(
                $serialize ? serialize($value) : $value,
                strtolower($this->cipher), $this->key, 0, $iv, $tag
            )
            : \openssl_encrypt(
                $serialize ? serialize($value) : $value,
                strtolower($this->cipher), $this->key, 0, $iv
            );

        if ($value === false) {
            throw new EncryptException('Could not encrypt the data.');
        }

        $iv = base64_encode($iv);
        $tag = base64_encode($tag);

        $mac = self::$supportedCiphers[strtolower($this->cipher)]['aead']
            ? '' // For AEAD-algoritms, the tag / MAC is returned by openssl_encrypt...
            : $this->hash($iv, $value);

        $json = json_encode(compact('iv', 'value', 'mac', 'tag'), JSON_UNESCAPED_SLASHES);

        if (json_last_error() !== JSON_ERROR_NONE) {
            throw new EncryptException('Could not encrypt the data.');
        }

        return base64_encode($json);
    }

    /**
     * Encrypt a string without serialization.
     *
     * @param  string  $value
     * @return string
     *
     * @throws \Illuminate\Contracts\Encryption\EncryptException
     */
    public function encryptString($value)
    {
        return $this->encrypt($value, false);
    }

    /**
     * Decrypt the given value.
     *
     * @param  string  $payload
     * @param  bool  $unserialize
     * @return mixed
     *
     * @throws \Illuminate\Contracts\Encryption\DecryptException
     */
    public function decrypt($payload, $unserialize = true)
    {
        $payload = $this->getJsonPayload($payload);

        $iv = base64_decode($payload['iv']);

        $tag = empty($payload['tag']) ? null : base64_decode($payload['tag']);

        if (self::$supportedCiphers[strtolower($this->cipher)]['aead'] && strlen($tag) !== 16) {
            throw new DecryptException('Could not decrypt the data.');
        }

        // Here we will decrypt the value. If we are able to successfully decrypt it
        // we will then unserialize it and return it out to the caller. If we are
        // unable to decrypt this value we will throw out an exception message.
        $decrypted = \openssl_decrypt(
            $payload['value'], strtolower($this->cipher), $this->key, 0, $iv, $tag ?? ''
        );

        if ($decrypted === false) {
            throw new DecryptException('Could not decrypt the data.');
        }

        return $unserialize ? unserialize($decrypted) : $decrypted;
    }
    /**
     * Decrypt the given string without unserialization.
     *
     * @param  string  $payload
     * @return string
     *
     * @throws \Illuminate\Contracts\Encryption\DecryptException
     */
    public function decryptString($payload)
    {
        return $this->decrypt($payload, false);
    }
    /**
     * Create a MAC for the given value.
     *
     * @param  string  $iv
     * @param  mixed  $value
     * @return string
     */
    protected function hash($iv, $value)
    {
        return hash_hmac('sha256', $iv.$value, $this->key);
    }
    /**
     * Get the JSON array from the given payload.
     *
     * @param  string  $payload
     * @return array
     *
     * @throws \Illuminate\Contracts\Encryption\DecryptException
     */
    protected function getJsonPayload($payload)
    {
        $payload = json_decode(base64_decode($payload), true);
        // If the payload is not valid JSON or does not have the proper keys set we will
        // assume it is invalid and bail out of the routine since we will not be able
        // to decrypt the given value. We'll also check the MAC for this encryption.
        if (! $this->validPayload($payload)) {
            throw new DecryptException('The payload is invalid.');
        }

        if (! self::$supportedCiphers[strtolower($this->cipher)]['aead'] && ! $this->validMac($payload)) {
            throw new DecryptException('The MAC is invalid.');
        }
        return $payload;
    }

    /**
     * Verify that the encryption payload is valid.
     *
     * @param  mixed  $payload
     * @return bool
     */
    protected function validPayload($payload)
    {
        return is_array($payload) && isset($payload['iv'], $payload['value'], $payload['mac']) &&
            strlen(base64_decode($payload['iv'], true)) === openssl_cipher_iv_length(strtolower($this->cipher));
    }

    /**
     * Determine if the MAC for the given payload is valid.
     *
     * @param  array  $payload
     * @return bool
     */
    protected function validMac(array $payload)
    {
        return hash_equals(
            $this->hash($payload['iv'], $payload['value']), $payload['mac']
        );
    }

    /**
     * Get the encryption key.
     *
     * @return string
     */
    public function getKey()
    {
        return $this->key;
    }
}
