<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    
    class Carwash {
        private $connect;
    
        public function __construct($conn) {
            $this->connect = $conn;
        }
    
        public function sendFeedback($status, $message, $data = null) {
            $response = [
                'status' => $status,
                'message' => $message,
                'data' => $data
            ];
            return json_encode($response);
        }
        
         public function userInfo($userId) {
            $query = "SELECT account_id as account_id ,first_name as first_name,family_name as family_name,us_phone as phone,wash_from as wash_from  FROM tbl_users WHERE account_id =? ";
            
            $stmt = $this->connect->prepare($query);
            $stmt->execute([$userId]);
            $studentInfo = $stmt->rowCount() > 0 ? $stmt->fetch(PDO::FETCH_ASSOC) : [];  
            $stmt = null;
            
            return $studentInfo;
        }
        
//         public function getBrands($wash_from) {
//     $query = "SELECT brand_id as brand_id,brand_name as brand_name,description as Brand_description FROM tbl_car_brands WHERE wash_from = ?";
    
//     $stmt = $this->connect->prepare($query);
//     $stmt->execute([$wash_from]);
//     $branddata = $stmt->rowCount() > 0 ? $stmt->fetchAll(PDO::FETCH_ASSOC) : [];  
  
//     if( $stmt->rowCount()>0){
    
//       $data = [
//                 'brandList' => $branddata
                
//           ];
//             // 'admission_fees' => $admission_fees
            
//             return $this->sendFeedback(200, 'Success', $data);
//     }
//     else {
//          return $this->sendFeedback(404, 'no data found', $wash_from);
//     }
// }
        
         public function getBrands($wash_from) {
            $query = "SELECT brand_id as brand_id,brand_name as brand_name,description as Brand_description FROM tbl_car_brands WHERE wash_from = ?";
            
            $stmt = $this->connect->prepare($query);
            $stmt->execute([$wash_from]);
            $branddata = $stmt->rowCount() > 0 ? $stmt->fetchAll(PDO::FETCH_ASSOC) : [];  
          
            if( $stmt->rowCount()>0){
            
              $data = [
                        'brandList' => $branddata
                        
                  ];
                    // 'admission_fees' => $admission_fees
                    
                    return $this->sendFeedback(200, 'Success', $data);
            }
            else {
                 return $this->sendFeedback(404, 'no data found', $wash_from);
            }
        }
        
        
         public function serviceOnCar($plate_no,$wash_from,$recorded_by,$service_id,$amount,$washer_id) {
           
            
             $query = "SELECT *  FROM car_serve WHERE wash_from =? and plate_no=?  and status=0";
            
            $stmt = $this->connect->prepare($query);
            $stmt->execute([$wash_from,$plate_no]);
            
            if($stmt->rowCount() >0){
                $res = $stmt->fetch();
                $c_in_id=$res['c_in_id'];
                $entre_time=date("Y-m-d H:i:m");
                
            $queryDuplicate ="SELECT * FROM tbl_transaction WHERE wash_used =? and plate_no=? and service_id=?  and status=0";
            
            $stmtDulicate = $this->connect->prepare($queryDuplicate);
            $stmtDulicate->execute([$wash_from,$plate_no,$service_id]);
            
            if($stmtDulicate->rowCount() ==0){
                
            $stmt = $this->connect->prepare("INSERT INTO tbl_transaction(plate_no,service_id,washer_id,assigned_by,amount,duetime,wash_used,status) VALUES (?,?, ?,?,?,?,?,?)");
            $stmt->execute([$plate_no,$service_id, $washer_id,$recorded_by, $amount,$entre_time,$wash_from,0]);
             
            $data = [
                        'dataSend' => $service_id
                        
                   ];
                   
                    return $this->sendFeedback(200, "service Added!",$data);
                    
            }
            
            else 
            {
                 $data = [
                        'dataSend' => $service_id
                        
                   ];
                   
                    return $this->sendFeedback(500, "service Already added!",$data);
            }
            }
            else {
                
                 $data = [
                        'dataSend' => $plate_no
                        
                   ];
                
                return $this->sendFeedback(400, " no data found! ",$data);
                
            }
           
           
                   
        }
        
        public function paymentData($plate_no,$wash_from,$ended_by,$amount,$pyt_mode_id) {
           
            
             $query = "SELECT *  FROM car_serve WHERE wash_from =? and plate_no=?  and status=0";
            
            $stmt = $this->connect->prepare($query);
            $stmt->execute([$wash_from,$plate_no]);
            
            if($stmt->rowCount() >0){
                $res = $stmt->fetch();
                $c_in_id=$res['c_in_id'];
                $entre_time=date("Y-m-d H:i:m");
                
            $queryDuplicate ="SELECT * FROM tbl_transaction WHERE wash_used =? and plate_no=?   and status=0";
            
            $stmtDulicate = $this->connect->prepare($queryDuplicate);
            $stmtDulicate->execute([$wash_from,$plate_no]);
            
            if($stmtDulicate->rowCount() > 0){
                
            $totalPaid= $this->totalPaid($plate_no);
            
            $amountPaid=$totalPaid['totalPaid'];
            if($amount==$amountPaid){
                
            // $stmt = $this->connect->prepare("INSERT INTO tbl_transaction(plate_no,service_id,washer_id,assigned_by,amount,duetime,wash_used,status) VALUES (?,?, ?,?,?,?,?,?)");
            // $stmt->execute([$plate_no,$service_id, $washer_id,$recorded_by, $amount,$entre_time,$wash_from,0]);
            
            
            $queryMode = "SELECT *  FROM tbl_payment_account WHERE acc_py_id =? ";
            $stmtMode = $this->connect->prepare($queryMode);
            $stmtMode->execute([$pyt_mode_id]);
            
            if($stmtMode->rowCount() >0){
                
            $stmt = $this->connect->prepare("UPDATE tbl_transaction SET status=1,ended_by='".$ended_by."',ended_time='".$entre_time."',pay_mode='".$pyt_mode_id."' where plate_no=? and status=0 and wash_used =? ");
            $stmt->execute([$plate_no, $wash_from]); 
            
            $stmt2 = $this->connect->prepare("UPDATE car_serve SET status=1 where plate_no=? and status=0 and wash_from =? ");
            $stmt2->execute([$plate_no, $wash_from]); 
            
             
            $data = ['dataSend' => $amountPaid];
            return $this->sendFeedback(200, " Well done",$data);
            }
            
            else {
             $data = ['dataSend' => $amountPaid];
            return $this->sendFeedback(200, " Wrong Payment Method",$data);   
                
            }
                
            }
            
            
            
            else {
                 $data = ['dataSend' => $amountPaid];
            
                return $this->sendFeedback(200, " amountPaid Mismatch Please pay $amountPaid Frw ",$amount);
            }
                    
            }
            
            else 
            {
                 $data = [
                        'dataSend' => $plate_no
                        
                   ];
                   
                    return $this->sendFeedback(500, "no service assigned on car!",$data);
            }
            }
            else {
                
                 $data = [
                        'dataSend' => $plate_no
                        
                   ];
                
                return $this->sendFeedback(400, " no data found! ",$data);
                
            }
           
           
                   
        }
        
        public function createEntry($plate_no,$wash_from,$recorded_by,$phone,$brand_id) {
           
            $entre_time=date("Y-m-d H:i:m");
             $query = "SELECT *  FROM car_serve WHERE wash_from =? and plate_no=?  and status=0";
            
            $stmt = $this->connect->prepare($query);
            $stmt->execute([$wash_from,$plate_no]);
            
            if($stmt->rowCount() ==0){
            $stmt = $this->connect->prepare("INSERT INTO car_serve(plate_no,entre_time, phone,entry_by,wash_from,status,brand_id) VALUES (?, ?, ?,?,?,?,?)");
            $stmt->execute([$plate_no,$entre_time, $phone,$recorded_by, $wash_from,0,$brand_id]);
             
            $data = [
                        'savedData' => $plate_no
                        
                   ];
                   
                    return $this->sendFeedback(200, "car recorded!",$data);
            }
            else {
                
                 $data = [
                        'savedData' => $plate_no
                        
                   ];
                
                return $this->sendFeedback(400, "Already recorded!",$data);
                
            }
           
           
                   
        }
          public function geServicesPrice($wash_from) {
            $query = "SELECT serve_id as serve_id ,serve_name as serviveName, price as amount FROM tbl_services
            inner join tbl_price on tbl_price.service_id=tbl_services.serve_id
            WHERE wash_from =? ";
            
            $stmt = $this->connect->prepare($query);
            $stmt->execute([$wash_from]);
            $servicesdata = $stmt->rowCount() > 0 ? $stmt->fetchAll(PDO::FETCH_ASSOC) : [];  
          
            if( $stmt->rowCount()>0){
            
              $data = [
                        'serviceListe' => $servicesdata
                        
                   ];
                    // 'admission_fees' => $admission_fees
                    
                    return $this->sendFeedback(200, 'Success', $data);
            }
            else {
                 return $this->sendFeedback(404, 'no data found', $wash_from);
            }
        }
         public function getWasherList($wash_from) {
            $query = "SELECT washer_id as washer_id ,washer_name as washer_name,w_phone as phone,address as address FROM tbl_washer
            
            WHERE wash_from =?  and status=1";
            
            $stmt = $this->connect->prepare($query);
            $stmt->execute([$wash_from]);
            $washerdata = $stmt->rowCount() > 0 ? $stmt->fetchAll(PDO::FETCH_ASSOC) : [];  
          
            if( $stmt->rowCount()>0){
            
              $data = [
                        'washerListe' => $washerdata
                        
                   ];
                    // 'admission_fees' => $admission_fees
                    
                    return $this->sendFeedback(200, 'Success', $data);
            }
            else {
                 return $this->sendFeedback(404, 'no data found', $wash_from);
            }
        }
        public function gePaymentMethod($wash_from) {
            $query = "SELECT acc_py_id as acc_py_id,account_name as account_name  FROM tbl_payment_account WHERE  status=1";
            
            $stmt = $this->connect->prepare($query);
            $stmt->execute();
            $modedata = $stmt->rowCount() > 0 ? $stmt->fetchAll(PDO::FETCH_ASSOC) : [];  
          
            if( $stmt->rowCount()>0){
            
              $data = [
                        'modeList' => $modedata
                        
                   ];
                    // 'admission_fees' => $admission_fees
                    
                    return $this->sendFeedback(200, 'Success', $data);
            }
            else {
                 return $this->sendFeedback(404, 'no data found', $wash_from);
            }
        }
        
        
        
        
         public function carInfo($c_in_id) 
         {
             $query = "SELECT plate_no as plate_no,entre_time as Entrance_time,phone as driver_phone,brand_name as car_brand,description as brand_type
             ,first_name as Entered_by FROM car_serve 
             inner join tbl_car_brands on tbl_car_brands.brand_id=car_serve.brand_id
             inner join tbl_users on tbl_users.account_id=car_serve.entry_by
             WHERE c_in_id =? ";
            
            $stmt = $this->connect->prepare($query);
            $stmt->execute([$c_in_id]);
            $carInfo = $stmt->rowCount() > 0 ? $stmt->fetch(PDO::FETCH_ASSOC) : [];  
            $stmt = null;
            
            return $carInfo; 
         }
         
          public function serviveInfo($plate_no) 
         {
             $query = "SELECT serve_name as service_name,amount as amount,duetime as Due_time,first_name as assigned_by,washer_name as umunamba from tbl_transaction
             inner join tbl_users on tbl_users.account_id=tbl_transaction.assigned_by
              inner join tbl_services on tbl_services.serve_id=tbl_transaction.service_id
              inner join  tbl_washer on  tbl_washer.washer_id=tbl_transaction.washer_id
             WHERE plate_no =? and tbl_transaction.status=0";
            
            $stmt = $this->connect->prepare($query);
            $stmt->execute([$plate_no]);
            $serviceInfo = $stmt->rowCount() > 0 ? $stmt->fetchAll(PDO::FETCH_ASSOC) : [];  
            $stmt = null;
            
            return $serviceInfo; 
         }
         
          public function totalPaid($plate_no) 
         {
             $query = "SELECT t.total_amount as totalPaid, COUNT(ts.service_id) as totalService 
                  FROM tbl_transaction t
                  LEFT JOIN tbl_transaction_services ts ON t.trans_id = ts.transaction_id AND ts.status=0
                  WHERE t.plate_no =? and t.status=0
                  GROUP BY t.trans_id";
        
            $stmt = $this->connect->prepare($query);
            $stmt->execute([$plate_no]);
            $paidAmount = $stmt->rowCount() > 0 ? $stmt->fetch(PDO::FETCH_ASSOC) : ['totalPaid' => 0, 'totalService' => 0];
            $stmt = null;
            
            // Format totalPaid to remove decimals
            if ($paidAmount['totalPaid'] !== null) {
                $paidAmount['totalPaid'] = (string)intval($paidAmount['totalPaid']);
            } else {
                $paidAmount['totalPaid'] = "0";
            }
            
            return $paidAmount; 
         }
           public function verfyLive($plate_no,$wash_from) {
            $query = "SELECT c_in_id,plate_no FROM car_serve WHERE plate_no =? AND wash_from=? and status=0 ";
            
            $stmt = $this->connect->prepare($query);
            $stmt->execute([$plate_no,$wash_from]);
             
          
            if( $stmt->rowCount()>0){
                $servicesdata = $stmt->fetch(PDO::FETCH_ASSOC) ; 
                
                $c_in_id=$servicesdata['c_in_id'];
                 $carInfo= $this->carInfo($c_in_id);
                 $serviceInfo= $this->serviveInfo($plate_no);
                 $totalPaid= $this->totalPaid($plate_no);
                
            
              $data = [
                        'carInfo' => $carInfo,
                        'serviveInfo ' => $serviceInfo,
                        'totalAmount' => $totalPaid
                        
                   ];
                    // 'admission_fees' => $admission_fees
                    
                    return $this->sendFeedback(200, 'Success', $data);
            }
            else {
                 return $this->sendFeedback(404, 'no data found', $wash_from);
            }
        }
        
        
        
        
        public function getUserAcess($username,$pwd) {
           
         //   $studentData = $this->getStudentBasicData($studentId);
          
    // $sth = $this->connect->prepare("SELECT * FROM tbl_users WHERE account_name ='".$username."' AND log_sts = 1 ");
      $query ="SELECT * FROM tbl_users WHERE account_name ='".$username."' AND log_sts = 1 ";
      $sth = $this->connect->prepare($query);
      $sth->execute();
    if($sth->rowCount() != 0){
        // $userInfo =$sth->fetch(PDO::FETCH_ASSOC);
        $res = $sth->fetch();
       
        if (password_verify($pwd,$res['account_passwd'])){
            $_SESSION['acc_id'] = $res['account_id'];
            $_SESSION['f_name'] = $res['first_name'];
            $_SESSION['l_name'] = $res['family_name'];
            $_SESSION['role_id'] = $res['role_id'];
           
            $_SESSION['account_name'] = $res['account_name'];
            
            $_SESSION['mob'] = $res['us_phone'];
            $_SESSION['access'] = true;
            $now = date("Y-m-d H:i:s");
            $_SESSION['status']= 'ON';
            
            $message = 'success';
            $accountId=$res['account_id'];
            $login_time =  $this->connect->prepare("update tbl_users set last_logged_in=? WHERE account_id =? ");
            
             $userInfo= $this->userInfo($accountId);
            
                    
                    if(empty($userInfo))
                    { 
                      return $this->sendFeedback(404, 'no data found', $username); 
                      
                     
                    }
                    else {
                         $data = [
                        'accountInfo' => $userInfo
                        
                   ];
                    // 'admission_fees' => $admission_fees
                    
                    return $this->sendFeedback(200, 'Success', $data);
                    }
              
              try {
                $login_time->execute(array($now,$accountId));
                } catch (PDOException $ex) {
                    echo $ex->getMessage();
                }
	}
	
	else {
	     return $this->sendFeedback(404, 'invalid  password', $pwd); 
	}
    }
    else {
        
        return $this->sendFeedback(404, 'invalid username ', $username); 
    }
            
        
        }
            public function getPendingTransactions($wash_from = null) {
            // Check if wash_from is provided and valid
            if ($wash_from === null || $wash_from === '' || !is_numeric($wash_from)) {
                return $this->sendFeedback(400, 'wash_from parameter is required and must be valid', null);
            }
            
            $query = "SELECT 
                t.trans_id,
                t.plate_no,
                t.service_id,
                s.serve_name as service_name,
                t.washer_id,
                w.washer_name,
                t.assigned_by,
                u.first_name as assigned_by_name,
                t.amount,
                t.duetime,
                t.wash_used,
                cs.entre_time,
                cs.phone as driver_phone,
                cb.brand_name as car_brand,
                cs.c_in_id
                FROM tbl_transaction t
                INNER JOIN car_serve cs ON t.plate_no = cs.plate_no AND t.wash_used = cs.wash_from
                INNER JOIN tbl_services s ON t.service_id = s.serve_id
                INNER JOIN tbl_washer w ON t.washer_id = w.washer_id
                INNER JOIN tbl_users u ON t.assigned_by = u.account_id
                LEFT JOIN tbl_car_brands cb ON cs.brand_id = cb.brand_id
                WHERE t.status = 0 AND cs.status = 0 AND t.wash_used = ?
                ORDER BY t.duetime DESC";
            
            $stmt = $this->connect->prepare($query);
            $stmt->execute([$wash_from]);
            $pendingTransactions = $stmt->rowCount() > 0 ? $stmt->fetchAll(PDO::FETCH_ASSOC) : [];
            
            if ($stmt->rowCount() > 0) {
                $data = [
                    'pendingTransactions' => $pendingTransactions,
                    'totalCount' => count($pendingTransactions)
                ];
                return $this->sendFeedback(200, 'Success', $data);
            } else {
                return $this->sendFeedback(404, 'No pending transactions found for this wash location', null);
            }
        }
        
        public function getCompletedTransactions($wash_from = null) {
            // Check if wash_from is provided and valid
            if ($wash_from === null || $wash_from === '' || !is_numeric($wash_from)) {
                return $this->sendFeedback(400, 'wash_from parameter is required and must be valid', null);
            }
            
            $query = "SELECT 
                t.trans_id,
                t.plate_no,
                t.service_id,
                s.serve_name as service_name,
                t.washer_id,
                w.washer_name,
                t.assigned_by,
                u.first_name as assigned_by_name,
                t.ended_by,
                u2.first_name as ended_by_name,
                t.amount,
                t.duetime,
                t.ended_time,
                t.wash_used,
                t.pay_mode,
                pa.account_name as payment_method,
                cs.entre_time,
                cs.phone as driver_phone,
                cb.brand_name as car_brand,
                cs.c_in_id
                FROM tbl_transaction t
                INNER JOIN car_serve cs ON t.plate_no = cs.plate_no AND t.wash_used = cs.wash_from
                INNER JOIN tbl_services s ON t.service_id = s.serve_id
                INNER JOIN tbl_washer w ON t.washer_id = w.washer_id
                INNER JOIN tbl_users u ON t.assigned_by = u.account_id
                LEFT JOIN tbl_users u2 ON t.ended_by = u2.account_id
                LEFT JOIN tbl_car_brands cb ON cs.brand_id = cb.brand_id
                LEFT JOIN tbl_payment_account pa ON t.pay_mode = pa.acc_py_id
                WHERE t.status = 1 AND cs.status = 1 AND t.wash_used = ?
                ORDER BY t.ended_time DESC";
            
            $stmt = $this->connect->prepare($query);
            $stmt->execute([$wash_from]);
            $completedTransactions = $stmt->rowCount() > 0 ? $stmt->fetchAll(PDO::FETCH_ASSOC) : [];
            
            if ($stmt->rowCount() > 0) {
                $data = [
                    'completedTransactions' => $completedTransactions,
                    'totalCount' => count($completedTransactions)
                ];
                return $this->sendFeedback(200, 'Success', $data);
            } else {
                return $this->sendFeedback(404, 'No completed transactions found for this wash location', null);
            }
        }

  
        public function __destruct() {
            if ($this->connect) {
                $this->connect = null;
            }
        }
    }
?>