<?php
// Sipariş atama API'si
// Admin/Manager siparişleri kuryeye atar, kurye siparişlerini görür ve teslim eder

header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit();
}

require_once '../config/database.php';

// Hata raporlamayı aç
error_reporting(E_ALL);
ini_set('display_errors', 1);

// Veritabanı bağlantı bilgileri
$host = "localhost";
$username = "hemensuc_admin";
$password = "okanbeyin.2002";
$database = "hemensuc_database";

try {
    $pdo = new PDO("mysql:host=$host;dbname=$database;charset=utf8mb4", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode([
        'success' => false,
        'error' => 'Veritabanı bağlantı hatası: ' . $e->getMessage()
    ]);
    exit();
}

// Token doğrulama fonksiyonu
function validateToken($pdo, $token) {
    if (empty($token)) {
        return null;
    }
    
    try {
        $stmt = $pdo->prepare("
            SELECT u.*, s.expires_at 
            FROM users u 
            JOIN user_sessions s ON u.id = s.user_id 
            WHERE s.session_token = ? AND s.expires_at > NOW()
        ");
        $stmt->execute([$token]);
        return $stmt->fetch();
    } catch (PDOException $e) {
        return null;
    }
}

// JSON input'u al
$input = json_decode(file_get_contents('php://input'), true);
$method = $_SERVER['REQUEST_METHOD'];

// Token'ı al
$token = $input['token'] ?? $_GET['token'] ?? $_POST['token'] ?? null;

// Token doğrula
$user = validateToken($pdo, $token);
if (!$user) {
    http_response_code(401);
    echo json_encode([
        'success' => false,
        'error' => 'Geçersiz veya süresi dolmuş token'
    ]);
    exit();
}

try {
    switch ($method) {
        case 'GET':
            handleGetRequest($pdo, $user, $_GET);
            break;
            
        case 'POST':
            handlePostRequest($pdo, $user, $input);
            break;
            
        case 'PUT':
            handlePutRequest($pdo, $user, $input);
            break;
            
        case 'DELETE':
            handleDeleteRequest($pdo, $user, $input);
            break;
            
        default:
            http_response_code(405);
            echo json_encode([
                'success' => false,
                'error' => 'Desteklenmeyen HTTP metodu'
            ]);
            break;
    }
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode([
        'success' => false,
        'error' => 'Sunucu hatası: ' . $e->getMessage()
    ]);
}

// GET: Sipariş atamalarını listele
function handleGetRequest($pdo, $user, $params) {
    $action = $params['action'] ?? 'list';
    
    switch ($action) {
        case 'list':
            listAssignments($pdo, $user, $params);
            break;
            
        case 'couriers':
            listCouriers($pdo, $user);
            break;
            
        case 'my_orders':
            listMyOrders($pdo, $user);
            break;
            
        default:
            http_response_code(400);
            echo json_encode([
                'success' => false,
                'error' => 'Geçersiz action parametresi'
            ]);
            break;
    }
}

// Sipariş atamalarını listele (Admin/Manager için)
function listAssignments($pdo, $user, $params) {
    // Sadece admin ve manager görebilir
    if (!in_array($user['role'], ['admin', 'manager'])) {
        http_response_code(403);
        echo json_encode([
            'success' => false,
            'error' => 'Bu işlem için yetkiniz yok'
        ]);
        return;
    }
    
    try {
        $sql = "
            SELECT 
                oa.*,
                u_assigned.full_name as courier_name,
                u_assigned.username as courier_username,
                u_assigned_by.full_name as assigned_by_name
            FROM order_assignments oa
            LEFT JOIN users u_assigned ON oa.assigned_to = u_assigned.id
            LEFT JOIN users u_assigned_by ON oa.assigned_by = u_assigned_by.id
            ORDER BY oa.assigned_at DESC
        ";
        
        $stmt = $pdo->prepare($sql);
        $stmt->execute();
        $assignments = $stmt->fetchAll();
        
        echo json_encode([
            'success' => true,
            'data' => $assignments
        ]);
        
    } catch (PDOException $e) {
        http_response_code(500);
        echo json_encode([
            'success' => false,
            'error' => 'Atamalar listelenirken hata oluştu: ' . $e->getMessage()
        ]);
    }
}

// Kurye listesini getir (Admin/Manager için)
function listCouriers($pdo, $user) {
    // Sadece admin ve manager görebilir
    if (!in_array($user['role'], ['admin', 'manager'])) {
        http_response_code(403);
        echo json_encode([
            'success' => false,
            'error' => 'Bu işlem için yetkiniz yok'
        ]);
        return;
    }
    
    try {
        $sql = "
            SELECT 
                id, 
                username, 
                full_name, 
                email,
                status,
                (SELECT COUNT(*) FROM order_assignments WHERE assigned_to = users.id AND status = 'assigned') as active_orders,
                (SELECT COALESCE(MAX(priority_order), 0) FROM order_assignments WHERE assigned_to = users.id AND status = 'assigned') as max_priority
            FROM users 
            WHERE role = 'user' AND status = 'active'
            ORDER BY full_name
        ";
        
        $stmt = $pdo->prepare($sql);
        $stmt->execute();
        $couriers = $stmt->fetchAll();
        
        echo json_encode([
            'success' => true,
            'data' => $couriers
        ]);
        
    } catch (PDOException $e) {
        http_response_code(500);
        echo json_encode([
            'success' => false,
            'error' => 'Kurye listesi alınırken hata oluştu: ' . $e->getMessage()
        ]);
    }
}

// Benim siparişlerimi listele (Kurye için)
function listMyOrders($pdo, $user) {
    // Sadece user (kurye) görebilir
    if ($user['role'] !== 'user') {
        http_response_code(403);
        echo json_encode([
            'success' => false,
            'error' => 'Bu işlem sadece kuryeler için'
        ]);
        return;
    }
    
    try {
        $sql = "
            SELECT 
                oa.*,
                u_assigned_by.full_name as assigned_by_name
            FROM order_assignments oa
            LEFT JOIN users u_assigned_by ON oa.assigned_by = u_assigned_by.id
            WHERE oa.assigned_to = ? AND oa.status = 'assigned'
            ORDER BY oa.priority_order ASC, oa.assigned_at ASC
        ";
        
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$user['id']]);
        $myOrders = $stmt->fetchAll();
        
        echo json_encode([
            'success' => true,
            'data' => $myOrders
        ]);
        
    } catch (PDOException $e) {
        http_response_code(500);
        echo json_encode([
            'success' => false,
            'error' => 'Siparişler listelenirken hata oluştu: ' . $e->getMessage()
        ]);
    }
}

// POST: Yeni sipariş atama
function handlePostRequest($pdo, $user, $input) {
    $action = $input['action'] ?? 'assign';
    
    switch ($action) {
        case 'assign':
            assignOrder($pdo, $user, $input);
            break;
            
        case 'clear_reports':
            clearCourierReports($pdo, $user, $input);
            break;
            
        default:
            http_response_code(400);
            echo json_encode([
                'success' => false,
                'error' => 'Geçersiz action parametresi'
            ]);
            break;
    }
}

// Sipariş atama (Admin/Manager)
function assignOrder($pdo, $user, $input) {
    // Sadece admin ve manager atayabilir
    if (!in_array($user['role'], ['admin', 'manager'])) {
        http_response_code(403);
        echo json_encode([
            'success' => false,
            'error' => 'Bu işlem için yetkiniz yok'
        ]);
        return;
    }
    
    // Gerekli alanları kontrol et
    $requiredFields = ['order_number', 'store_id', 'assigned_to'];
    foreach ($requiredFields as $field) {
        if (empty($input[$field])) {
            http_response_code(400);
            echo json_encode([
                'success' => false,
                'error' => "Eksik alan: $field"
            ]);
            return;
        }
    }
    
    // Sipariş tutarını kontrol et ve varsayılan değer ata
    $orderAmount = isset($input['order_amount']) ? floatval($input['order_amount']) : 0.00;
    if ($orderAmount < 0) {
        $orderAmount = 0.00;
    }
    
    // Öncelik sırasını kontrol et ve varsayılan değer ata (1-8 arası)
    $priorityOrder = isset($input['priority_order']) ? intval($input['priority_order']) : 1;
    if ($priorityOrder < 1 || $priorityOrder > 8) {
        $priorityOrder = 1; // Geçersiz değer varsa 1 yap
    }
    
    try {
        // Kurye var mı kontrol et
        $stmt = $pdo->prepare("SELECT id, full_name FROM users WHERE id = ? AND role = 'user' AND status = 'active'");
        $stmt->execute([$input['assigned_to']]);
        $courier = $stmt->fetch();
        
        if (!$courier) {
            http_response_code(400);
            echo json_encode([
                'success' => false,
                'error' => 'Geçersiz kurye ID\'si'
            ]);
            return;
        }
        
        // Sipariş zaten atanmış mı kontrol et
        $stmt = $pdo->prepare("SELECT id FROM order_assignments WHERE order_number = ? AND store_id = ?");
        $stmt->execute([$input['order_number'], $input['store_id']]);
        
        if ($stmt->fetch()) {
            http_response_code(400);
            echo json_encode([
                'success' => false,
                'error' => 'Bu sipariş zaten atanmış'
            ]);
            return;
        }
        
        // Atamayı kaydet
        $sql = "
            INSERT INTO order_assignments 
            (order_number, store_id, assigned_to, assigned_by, order_amount, priority_order, notes) 
            VALUES (?, ?, ?, ?, ?, ?, ?)
        ";
        
        $stmt = $pdo->prepare($sql);
        $stmt->execute([
            $input['order_number'],
            $input['store_id'],
            $input['assigned_to'],
            $user['id'],
            $orderAmount,
            $priorityOrder,
            $input['notes'] ?? null
        ]);
        
        echo json_encode([
            'success' => true,
            'message' => "Sipariş {$courier['full_name']} kuryesine başarıyla atandı",
            'data' => [
                'assignment_id' => $pdo->lastInsertId(),
                'order_number' => $input['order_number'],
                'courier_name' => $courier['full_name']
            ]
        ]);
        
    } catch (PDOException $e) {
        http_response_code(500);
        echo json_encode([
            'success' => false,
            'error' => 'Sipariş atanırken hata oluştu: ' . $e->getMessage()
        ]);
    }
}

// PUT: Sipariş durumunu güncelle
function handlePutRequest($pdo, $user, $input) {
    $action = $input['action'] ?? 'update_status';
    
    switch ($action) {
        case 'update_status':
            updateOrderStatus($pdo, $user, $input);
            break;
            
        default:
            http_response_code(400);
            echo json_encode([
                'success' => false,
                'error' => 'Geçersiz action parametresi'
            ]);
            break;
    }
}

// Sipariş durumunu güncelle
function updateOrderStatus($pdo, $user, $input) {
    // Gerekli alanları kontrol et
    if (empty($input['assignment_id']) || empty($input['status'])) {
        http_response_code(400);
        echo json_encode([
            'success' => false,
            'error' => 'Eksik alanlar: assignment_id ve status gerekli'
        ]);
        return;
    }
    
    // Geçerli durumları kontrol et
    $validStatuses = ['assigned', 'delivered', 'cancelled'];
    if (!in_array($input['status'], $validStatuses)) {
        http_response_code(400);
        echo json_encode([
            'success' => false,
            'error' => 'Geçersiz durum. Geçerli durumlar: ' . implode(', ', $validStatuses)
        ]);
        return;
    }
    
    try {
        // Atamayı kontrol et
        $stmt = $pdo->prepare("SELECT * FROM order_assignments WHERE id = ?");
        $stmt->execute([$input['assignment_id']]);
        $assignment = $stmt->fetch();
        
        if (!$assignment) {
            http_response_code(404);
            echo json_encode([
                'success' => false,
                'error' => 'Sipariş ataması bulunamadı'
            ]);
            return;
        }
        
        // Yetki kontrolü
        if ($user['role'] === 'user') {
            // Kurye sadece kendi siparişlerini güncelleyebilir ve sadece 'delivered' yapabilir
            if ($assignment['assigned_to'] != $user['id']) {
                http_response_code(403);
                echo json_encode([
                    'success' => false,
                    'error' => 'Bu siparişi güncelleme yetkiniz yok'
                ]);
                return;
            }
            
            if ($input['status'] !== 'delivered') {
                http_response_code(403);
                echo json_encode([
                    'success' => false,
                    'error' => 'Kurye sadece siparişi teslim edildi olarak işaretleyebilir'
                ]);
                return;
            }
        } elseif (!in_array($user['role'], ['admin', 'manager'])) {
            http_response_code(403);
            echo json_encode([
                'success' => false,
                'error' => 'Bu işlem için yetkiniz yok'
            ]);
            return;
        }
        
        // Durumu güncelle
        $sql = "UPDATE order_assignments SET status = ?";
        $params = [$input['status']];
        
        if ($input['status'] === 'delivered') {
            $sql .= ", delivered_at = NOW()";
        }
        
        if (!empty($input['notes'])) {
            $sql .= ", notes = ?";
            $params[] = $input['notes'];
        }
        
        $sql .= " WHERE id = ?";
        $params[] = $input['assignment_id'];
        
        $stmt = $pdo->prepare($sql);
        $stmt->execute($params);
        
        $statusText = [
            'assigned' => 'Atandı',
            'delivered' => 'Teslim Edildi',
            'cancelled' => 'İptal Edildi'
        ];
        
        echo json_encode([
            'success' => true,
            'message' => "Sipariş durumu '{$statusText[$input['status']]}' olarak güncellendi",
            'data' => [
                'assignment_id' => $input['assignment_id'],
                'new_status' => $input['status'],
                'order_number' => $assignment['order_number']
            ]
        ]);
        
    } catch (PDOException $e) {
        http_response_code(500);
        echo json_encode([
            'success' => false,
            'error' => 'Durum güncellenirken hata oluştu: ' . $e->getMessage()
        ]);
    }
}

// DELETE: Sipariş atamasını iptal et
function handleDeleteRequest($pdo, $user, $input) {
    // Sadece admin ve manager iptal edebilir
    if (!in_array($user['role'], ['admin', 'manager'])) {
        http_response_code(403);
        echo json_encode([
            'success' => false,
            'error' => 'Bu işlem için yetkiniz yok'
        ]);
        return;
    }
    
    if (empty($input['assignment_id'])) {
        http_response_code(400);
        echo json_encode([
            'success' => false,
            'error' => 'Eksik alan: assignment_id'
        ]);
        return;
    }
    
    try {
        // Atamayı kontrol et
        $stmt = $pdo->prepare("SELECT * FROM order_assignments WHERE id = ?");
        $stmt->execute([$input['assignment_id']]);
        $assignment = $stmt->fetch();
        
        if (!$assignment) {
            http_response_code(404);
            echo json_encode([
                'success' => false,
                'error' => 'Sipariş ataması bulunamadı'
            ]);
            return;
        }
        
        // Atamayı sil
        $stmt = $pdo->prepare("DELETE FROM order_assignments WHERE id = ?");
        $stmt->execute([$input['assignment_id']]);
        
        echo json_encode([
            'success' => true,
            'message' => 'Sipariş ataması başarıyla iptal edildi',
            'data' => [
                'assignment_id' => $input['assignment_id'],
                'order_number' => $assignment['order_number']
            ]
        ]);
        
    } catch (PDOException $e) {
        http_response_code(500);
        echo json_encode([
            'success' => false,
            'error' => 'Atama iptal edilirken hata oluştu: ' . $e->getMessage()
        ]);
    }
}

// Kurye raporlarını sıfırla (Admin/Manager)
function clearCourierReports($pdo, $user, $input) {
    // Sadece admin ve manager sıfırlayabilir
    if (!in_array($user['role'], ['admin', 'manager'])) {
        http_response_code(403);
        echo json_encode([
            'success' => false,
            'error' => 'Bu işlem için yetkiniz yok'
        ]);
        return;
    }
    
    try {
        // Önce mevcut kayıt sayısını al
        $stmt = $pdo->prepare("SELECT COUNT(*) as total FROM order_assignments");
        $stmt->execute();
        $totalRecords = $stmt->fetch()['total'];
        
        // Tüm sipariş atamalarını sil
        $stmt = $pdo->prepare("DELETE FROM order_assignments");
        $stmt->execute();
        $deletedCount = $stmt->rowCount();
        
        echo json_encode([
            'success' => true,
            'message' => 'Kurye raporları başarıyla sıfırlandı',
            'data' => [
                'deleted_count' => $deletedCount,
                'total_records' => $totalRecords,
                'cleared_by' => $user['full_name'],
                'cleared_at' => date('Y-m-d H:i:s')
            ]
        ]);
        
    } catch (PDOException $e) {
        http_response_code(500);
        echo json_encode([
            'success' => false,
            'error' => 'Kurye raporları sıfırlanırken hata oluştu: ' . $e->getMessage()
        ]);
    }
}
?>
