<?php
if(!defined('BASEPATH')) {
   die('Direct access to the script is not allowed');
}
if ($admin["access"]["tickets"] != 1):
    header("Location:" . site_url("admin"));
    exit();
endif;
if ($_SESSION["client"]["data"]):
    $data = $_SESSION["client"]["data"];
    foreach ($data as $key => $value) {
        $$key = $value;
    }
    unset($_SESSION["client"]);
endif;
if (!route(2)):
    $page = 1;
elseif (is_numeric(route(2))):
    $page = route(2);
elseif (!is_numeric(route(2))):
    $action = route(2);
endif;
if (empty($action)):
    if ($_GET["search"] == "unread" && $_GET["search"]):
        $search = " client_new='2' ";
        $count = $conn->prepare("SELECT * FROM tickets INNER JOIN clients ON clients.client_id = tickets.client_id WHERE {$search}");
        $count->execute(array());
        $count = $count->rowCount();
        $search = "WHERE {$search}";
        $search_link = "?search=unread";
    elseif ($_GET["search_type"] == "client" && $_GET["search_type"]):
        $search_where = $_GET["search_type"];
        $search_word = $_GET["search"];
        $clients = $conn->prepare("SELECT client_id FROM clients WHERE username LIKE '%" . $search_word . "%' ");
        $clients->execute(array());
        $clients = $clients->fetchAll(PDO::FETCH_ASSOC);
        $id = "(";
        foreach ($clients as $client) {
            $id.= $client["client_id"] . ",";
        }
        if (substr($id, -1) == ","):
            $id = substr($id, 0, -1);
        endif;
        $id.= ")";
        $search = " tickets.client_id IN " . $id;
        $count = $conn->prepare("SELECT * FROM tickets INNER JOIN clients ON clients.client_id = tickets.client_id WHERE {$search}");
        $count->execute(array());
        $count = $count->rowCount();
        $search = "WHERE {$search}";
        $search_link = "?search=" . $search_word . "&search_type=" . $search_where;
    elseif ($_GET["status"]):
        $search = " status='" . $_GET["status"] . "' ";
        $count = $conn->prepare("SELECT * FROM tickets INNER JOIN clients ON clients.client_id = tickets.client_id WHERE {$search}");
        $count->execute(array());
        $count = $count->rowCount();
        $search = "WHERE {$search}";
        $search_link = "?status=" . $_GET["status"];
    elseif ($_GET["search"]):
        $search_where = $_GET["search_type"];
        $search_word = $_GET["search"];
        $search = $search_where . " LIKE '%" . $search_word . "%'";
        $count = $conn->prepare("SELECT * FROM tickets INNER JOIN clients ON clients.client_id = tickets.client_id WHERE {$search}");
        $count->execute(array());
        $count = $count->rowCount();
        $search = "WHERE {$search}";
        $search_link = "?search=" . $search_word . "&search_type=" . $search_where;
    else:
        $count = $conn->prepare("SELECT * FROM tickets INNER JOIN clients ON clients.client_id = tickets.client_id");
        $count->execute(array());
        $count = $count->rowCount();
    endif;
    $to = 50;
    $pageCount = ceil($count / $to);
    if ($page > $pageCount):
        $page = 1;
    endif;
    $where = ($page * $to) - $to;
    $paginationArr = ["count" => $pageCount, "current" => $page, "next" => $page + 1, "previous" => $page - 1];
    $tickets = $conn->prepare("SELECT * FROM tickets INNER JOIN clients ON clients.client_id = tickets.client_id $search ORDER BY FIELD(status, 'pending', 'answered', 'closed'),lastupdate_time DESC LIMIT $where,$to ");
    $tickets->execute(array());
    $tickets = $tickets->fetchAll(PDO::FETCH_ASSOC);
    
    if ($settings["ticket_autoclose"] == 1 && $settings["ticket_autoclose_time"] > 0) {
    $autoclose_time = $settings["ticket_autoclose_time"];
    $date_threshold = date('Y-m-d H:i:s', strtotime("-$autoclose_time days"));

    foreach ($tickets as $ticket) {
        if ($ticket['created_at'] < $date_threshold && $ticket['status'] != 'closed') {
            // টিকিট ক্লোজ করার লজিক
            $update = $conn->prepare("UPDATE tickets SET status = 'closed' WHERE ticket_id = :id");
            $update->execute(array("id" => $ticket['ticket_id']));
        }
    }
}
    require admin_view('tickets');
elseif (route(2) == "read"):
    if (!countRow(["table" => "tickets", "where" => ["ticket_id" => route(3) ]])):
        header("Location:" . site_url("admin/tickets"));
        exit();
    endif;
$id = route(3);
   $ticket = $conn->prepare("SELECT * FROM tickets  WHERE ticket_id=:id ");
    $ticket->execute(array("id"=>$id));
    $ticket = $ticket->fetchAll(PDO::FETCH_ASSOC);
if (route(4) == "delete"):
    $delete = $conn->prepare("DELETE FROM ticket_reply WHERE id=:t_id ");
    $delete->execute(array("t_id"=>route(3)));
endif;
    if ($_POST):
        
        $message = htmlspecialchars($_POST["message"]);
       
        if (strlen($message) < 3):
            $error = 1;
            $errorText = "Message should be at least 3 chracters.";
        else:
            $conn->beginTransaction();
            $update = $conn->prepare("UPDATE tickets SET canmessage=:canmessage, status=:status, lastupdate_time=:time, support_new=:new WHERE ticket_id=:t_id ");
            $update = $update->execute(array("t_id" => route(3), "time" => date("Y-m-d H:i:s"), "status" => "answered", "canmessage" => 2, "new" => 2));
             $tr_arr =array(
                "t_id" => route(3), 
                "time" => date("Y-m-d H:i:s"),
                "support" => '2',
                "message" => $message,
                "client_id"=>'0'
                );
           // print_r($tr_arr); die;
                   $insert = $conn->prepare("INSERT INTO ticket_reply SET ticket_id=:t_id, time=:time, support=:support, message=:message, client_id=:client_id");
            $insert = $insert->execute($tr_arr);
           // echo $update->debugDumpParams(); die;
            if ($insert && $update):

if ($settings["alert_newmessage"] == 2) {
    $htmlContent = '
    <html>
        <head>
            <style>
                body {
                    font-family: Arial, sans-serif;
                    background-color: #f9f9f9;
                    margin: 0;
                    padding: 0;
                }
                .email-container {
                    max-width: 600px;
                    margin: 30px auto;
                    background-color: #ffffff;
                    border-radius: 10px;
                    overflow: hidden;
                    box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
                }
                .email-header {
                    background-color: #4CAF50;
                    color: #ffffff;
                    text-align: center;
                    padding: 20px 0;
                    font-size: 22px;
                    font-weight: bold;
                }
                .email-body {
                    padding: 20px;
                    color: #333333;
                    font-size: 16px;
                    line-height: 1.6;
                }
                .email-body p {
                    margin: 15px 0;
                }
                .button {
                    display: inline-block;
                    background-color: #4CAF50;
                    color: #ffffff;
                    text-decoration: none;
                    padding: 10px 20px;
                    border-radius: 5px;
                    font-size: 16px;
                    margin: 20px 0;
                    text-align: center;
                }
                .button:hover {
                    background-color: #45a049;
                }
                .email-footer {
                    background-color: #f2f2f2;
                    text-align: center;
                    padding: 15px;
                    font-size: 14px;
                    color: #666666;
                    border-top: 1px solid #dddddd;
                }
            </style>
        </head>
        <body>
            <div class="email-container">
                <div class="email-header">
                    New Message for Ticket #' . htmlspecialchars(route(3)) . '
                </div>
                <div class="email-body">
                    <p>Hello <strong>' . htmlspecialchars($user["username"]) . '</strong>,</p>
                    <p>You have received a new message in your support ticket.</p>
                    <p>Please click the button below to view the message:</p>
                    <a href="' . site_url() . 'tickets/' . route(3) . '" class="button">View Ticket</a>
                    <p>If you have any questions, feel free to reach out to us.</p>
                    <p>Best regards,<br>The ' . htmlspecialchars($settings["site_name"]) . ' Team</p>
                </div>
                <div class="email-footer">
                    &copy; ' . date("Y") . ' ' . htmlspecialchars($settings["site_name"]) . '. All rights reserved.
                </div>
            </div>
        </body>
    </html>';

    $to = $user['email']; 
    $from = $settings["smtp_user"]; 
    $fromName = $settings["site_seo"]; 
    $subject = "New Message in Ticket #" . htmlspecialchars(route(3)); 
    $headers = "MIME-Version: 1.0" . "\r\n"; 
    $headers .= "Content-type: text/html; charset=UTF-8" . "\r\n"; 
    $headers .= 'From: ' . $fromName . '<' . $from . '>' . "\r\n"; 
    $headers .= 'Cc: ' . $from . "\r\n"; 
    $headers .= 'Bcc: ' . $from . "\r\n";  

    if (mail($to, $subject, $htmlContent, $headers)) { 
        // Email sent successfully
    } else { 
        // Email sending failed
    }
}
               //  echo "updated"; die;
                $conn->commit();
                header("Location:" . site_url("admin/tickets/read/" . route(3)));
                $_SESSION["client"]["data"]["success"] = 1;
                $_SESSION["client"]["data"]["successText"] = "Successful";
            else:
                //echo "not updated"; die;
                $conn->rollBack();
                header("Location:" . site_url("admin/tickets/read/" . route(3)));
                $_SESSION["client"]["data"]["error"] = 1;
                $_SESSION["client"]["data"]["errorText"] = "Error";
            endif;
        endif;
    endif;
    $update = $conn->prepare("UPDATE tickets SET client_new=:new WHERE ticket_id=:t_id ");
    $update->execute(array("t_id" => route(3), "new" => 1));
    $ticketMessage = $conn->prepare("SELECT ticket_reply.*,tickets.subject,tickets.client_new,tickets.status,tickets.canmessage,tickets.client_id,clients.username  FROM ticket_reply INNER JOIN tickets ON ticket_reply.ticket_id = tickets.ticket_id INNER JOIN clients ON clients.client_id = tickets.client_id WHERE ticket_reply.ticket_id=:t_id ORDER BY ticket_reply.id DESC ");
    $ticketMessage->execute(array("t_id" => route(3)));
    $ticketMessage = $ticketMessage->fetchAll(PDO::FETCH_ASSOC);
    require admin_view('tickets_read');
elseif (route(2) == "unread"):
    if (!countRow(["table" => "tickets", "where" => ["ticket_id" => route(3) ]])):
        header("Location:" . site_url("admin/tickets"));
        exit();
    endif;
    $update = $conn->prepare("UPDATE tickets SET client_new=:new WHERE ticket_id=:t_id ");
    $update->execute(array("t_id" => route(3), "new" => 2));
    if ($update):
        header("Location:" . site_url("admin/tickets"));
        $_SESSION["client"]["data"]["success"] = 1;
        $_SESSION["client"]["data"]["successText"] = "Successful";
    else:
        header("Location:" . site_url("admin/tickets"));
        $_SESSION["client"]["data"]["error"] = 1;
        $_SESSION["client"]["data"]["errorText"] = "Error";
    endif;
elseif (route(2) == "lock"):
    if (!countRow(["table" => "tickets", "where" => ["ticket_id" => route(3) ]])):
        header("Location:" . site_url("admin/tickets"));
        exit();
    endif;
    $update = $conn->prepare("UPDATE tickets SET canmessage=:can WHERE ticket_id=:t_id ");
    $update->execute(array("t_id" => route(3), "can" => 1));
    if ($update):
        header("Location:" . site_url("admin/tickets"));
        $_SESSION["client"]["data"]["success"] = 1;
        $_SESSION["client"]["data"]["successText"] = "Successful";
    else:
        header("Location:" . site_url("admin/tickets"));
        $_SESSION["client"]["data"]["error"] = 1;
        $_SESSION["client"]["data"]["errorText"] = "Error";
    endif;
elseif (route(2) == "delete"):
if (!countRow(["table" => "tickets", "where" => ["ticket_id" => route(3) ]])):
        header("Location:" . site_url("admin/tickets"));
        exit();
    endif;
    $delete = $conn->prepare("DELETE FROM tickets WHERE ticket_id=:t_id ");
    $delete->execute(array("t_id"=>route(3)));
    if ($delete):
        header("Location:" . site_url("admin/tickets"));
        $_SESSION["client"]["data"]["success"] = 1;
        $_SESSION["client"]["data"]["successText"] = "Successful";
    else:
        header("Location:" . site_url("admin/tickets"));
        $_SESSION["client"]["data"]["error"] = 1;
        $_SESSION["client"]["data"]["errorText"] = "Error";
    endif;
elseif (route(2) == "remove"):
    $ticket = $conn->prepare("SELECT * FROM ticket_reply WHERE id=:id");
$ticket->execute(array("id"=>route(3)));
$ticket = $ticket->fetch(PDO::FETCH_ASSOC);
    $delete = $conn->prepare("DELETE FROM ticket_reply WHERE id=:t_id ");
    $delete->execute(array("t_id"=>route(3)));
$ticketid = $ticket["ticket_id"];
    if ($delete):
        header("Location:" . site_url("admin/tickets/read/$ticketid"));;
        $_SESSION["client"]["data"]["success"] = 1;
        $_SESSION["client"]["data"]["successText"] = "Successful";
    else:
header("Location:" . site_url("admin/tickets/read/$ticketid"));
        $_SESSION["client"]["data"]["error"] = 1;
        $_SESSION["client"]["data"]["errorText"] = "Error";
    endif;
elseif (route(2) == "unlock"):
    if (!countRow(["table" => "tickets", "where" => ["ticket_id" => route(3) ]])):
        header("Location:" . site_url("admin/tickets"));
        exit();
    endif;
    $update = $conn->prepare("UPDATE tickets SET canmessage=:can WHERE ticket_id=:t_id ");
    $update->execute(array("t_id" => route(3), "can" => 2));
    if ($update):
        header("Location:" . site_url("admin/tickets"));
        $_SESSION["client"]["data"]["success"] = 1;
        $_SESSION["client"]["data"]["successText"] = "Successful";
    else:
    header("Location:" . site_url("admin/tickets"));
        $_SESSION["client"]["data"]["error"] = 1;
        $_SESSION["client"]["data"]["errorText"] = "Error";
    endif;
elseif (route(2) == "close"):
    if (!countRow(["table" => "tickets", "where" => ["ticket_id" => route(3) ]])):
        header("Location:" . site_url("admin/tickets"));
        exit();
    endif;
    $update = $conn->prepare("UPDATE tickets SET status=:status WHERE ticket_id=:t_id ");
    $update->execute(array("t_id" => route(3), "status" => "closed"));
    if ($update):
        header("Location:" . site_url("admin/tickets"));
        $_SESSION["client"]["data"]["success"] = 1;
        $_SESSION["client"]["data"]["successText"] = "Successful";
    else:
        header("Location:" . site_url("admin/tickets"));
        $_SESSION["client"]["data"]["error"] = 1;
        $_SESSION["client"]["data"]["errorText"] = "Error";
    endif;

elseif( route(2) == "multi-action" ):
          $tickets  = $_POST["ticket"];
          $action   = $_POST["bulkStatus"];
              if ($action == "unread"):
        foreach ($tickets as $id => $value):
            $update = $conn->prepare("UPDATE tickets SET client_new=:new WHERE ticket_id=:id ");
            $update->execute(array("new" => 2, "id" => $id));
        endforeach;
elseif ($action == "delete"):
        foreach ($tickets as $id => $value):
            $delete = $conn->prepare("DELETE FROM tickets WHERE ticket_id=:t_id ");
    $delete->execute(array("t_id"=>$id));
        endforeach;
    elseif ($action == "lock"):
        foreach ($tickets as $id => $value):
            $update = $conn->prepare("UPDATE tickets SET canmessage=:can WHERE ticket_id=:id ");
            $update->execute(array("can" => 1, "id" => $id));
        endforeach;
    elseif ($action == "unlock"):
        foreach ($tickets as $id => $value):
            $update = $conn->prepare("UPDATE tickets SET canmessage=:can WHERE ticket_id=:id ");
            $update->execute(array("can" => 2, "id" => $id));
        endforeach;
    elseif ($action == "close"):
        foreach ($tickets as $id => $value):
            $update = $conn->prepare("UPDATE tickets SET status=:status, canmessage=:can WHERE ticket_id=:id ");
            $update->execute(array("status" => "closed", "id" => $id, "can" => 2));
        endforeach;
    elseif ($action == "pending"):
        foreach ($tickets as $id => $value):
            $update = $conn->prepare("UPDATE tickets SET status=:status, canmessage=:can WHERE ticket_id=:id ");
            $update->execute(array("status" => "pending", "id" => $id, "can" => 2));
        endforeach;
    elseif ($action == "answered"):
        foreach ($tickets as $id => $value):
            $update = $conn->prepare("UPDATE tickets SET status=:status, canmessage=:can WHERE ticket_id=:id ");
            $update->execute(array("status" => "answered", "id" => $id, "can" => 2));
        endforeach;
    endif;
    header("Location:" . site_url("admin/tickets"));

 elseif( $action == "edit" ):
    if( $_POST ):
      foreach ($_POST as $key => $value) {
        $$key = $value;
      }
      
      if( empty($description) ):
        $error    = 1;
        $errorText= "Message cannot be empty";
        $icon     = "error";
      else:
          $conn->beginTransaction();
          
    $update = $conn->prepare("UPDATE ticket_reply SET message=:message WHERE id=:id ");
    $update->execute(array("id"=>route(3),"message"=>$description));
   
          if( $update ):
            $conn->commit();
            $error    = 1;
            $errorText= "Transaction successful";
            $icon     = "success";
          else:
            $conn->rollBack();
            $error    = 1;
            $errorText= "Operation failed";
            $icon     = "error";
          endif;
      endif;
      echo json_encode(["t"=>"error","m"=>$errorText,"s"=>$icon,"r"=>$referrer]);
    endif;    
  
elseif ($action == "new"):
    if ($_POST):
        foreach ($_POST as $key => $value) {
            $$key = $value;
        }
        $userRow = $conn->prepare("SELECT * FROM clients WHERE username=:username ");
        $userRow->execute(array("username" => $username));
        $userDetail = $userRow->fetch(PDO::FETCH_ASSOC);
        if (!$userRow->rowCount()):
            $error = 1;
            $errorText = "User not found";
            $icon = "error";
        elseif (empty($subject)):
            $error = 1;
            $errorText = "Subject can not be empty";
            $icon = "error";
        elseif (empty($message)):
            $error = 1;
            $errorText = "Message can not be empty";
            $icon = "error";
        else:
            $conn->beginTransaction();
            $insert = $conn->prepare("INSERT INTO tickets SET client_id=:c_id, subject=:subject, support_new=:support_new, client_new=:client_new, time=:time, lastupdate_time=:last_time ");
            $insert = $insert->execute(array("c_id" => $userDetail["client_id"], "subject" => htmlspecialchars($subject), "support_new" => 2, "client_new" => 1, "time" => date("Y.m.d H:i:s"), "last_time" => date("Y.m.d H:i:s")));



            if ($insert) {
                $ticket_id = $conn->lastInsertId();
if ($settings["alert_newmessage"] ==  2) {
$htmlContent = "Hello,
You have a new ticket from ". $settings["site_name"]. "
Follow the link below to see the message: " . site_url() . "tickets/$ticket_id";
$to = $userDetail['email']; 
$from = $settings["smtp_user"];
$fromName = $settings["site_seo"]; 
$subject = "New Message"; 
$headers = "MIME-Version: 1.0" . "\r\n"; 
$headers .= "Content-type:text/html;charset=UTF-8" . "\r\n"; 
$headers .= 'From: '.$fromName.'<'.$from.'>' . "\r\n"; 
$headers .= 'Cc: '.$from . "\r\n"; 
$headers .= 'Bcc: '.$from . "\r\n"; 
 if(mail($to, $subject, $htmlContent, $headers)){ 
}else{ 
     } 


} 
            }
            $insert2 = $conn->prepare("INSERT INTO ticket_reply SET ticket_id=:t_id, client_id=:c_id, support=:support, message=:message, time=:time ");
            $insert2 = $insert2->execute(array("t_id" => $ticket_id, "c_id" => $user["client_id"], "support" => 2, "message" => htmlspecialchars($message), "time" => date("Y.m.d H:i:s")));
            if ($insert && $insert2):
                $conn->commit();
                $referrer = site_url("admin/tickets");
                $error = 1;
                $errorText = "Successful";
                $icon = "success";
            else:
                $conn->rollBack();
                $error = 1;
                $errorText = "Error";
                $icon = "error";
            endif;
        endif;
        echo json_encode(["t" => "error", "m" => $errorText, "s" => $icon, "r" => $referrer]);
    endif;
endif;
