<?php
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');

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

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

$auth = new Auth();
$auth->requireLogin();

$database = new Database();
$db = $database->getConnection();

$input = json_decode(file_get_contents('php://input'), true);
$action = $input['action'] ?? $_GET['action'] ?? '';

try {
    switch ($action) {
        case 'add_tracking':
            addTracking($db, $input);
            break;
        case 'update_tracking':
            updateTracking($db, $input);
            break;
        case 'delete_tracking':
            deleteTracking($db, $input);
            break;
        case 'get_tracking':
            getTracking($db, $input);
            break;
        case 'get_analytics':
            getAnalytics($db, $input);
            break;
        case 'get_chart_data':
            getChartData($db, $input);
            break;
        case 'export_data':
            exportData($db, $input);
            break;
        default:
            throw new Exception('無效的操作');
    }
} catch (Exception $e) {
    http_response_code(400);
    echo json_encode([
        'success' => false,
        'message' => $e->getMessage()
    ]);
}

function addTracking($db, $input) {
    $brand_id = $input['brand_id'] ?? '';
    $keyword = $input['keyword'] ?? '';
    $target_url = $input['target_url'] ?? '';
    $target_ranking = $input['target_ranking'] ?? 1;
    $current_ranking = $input['current_ranking'] ?? 0;
    $search_volume = $input['search_volume'] ?? 0;
    $competition = $input['competition'] ?? 'low';
    $notes = $input['notes'] ?? '';
    
    if (empty($brand_id) || empty($keyword)) {
        throw new Exception('缺少必要參數');
    }
    
    // Check if tracking already exists
    $query = "SELECT id FROM seo_tracking WHERE brand_id = :brand_id AND keyword = :keyword";
    $stmt = $db->prepare($query);
    $stmt->bindParam(':brand_id', $brand_id);
    $stmt->bindParam(':keyword', $keyword);
    $stmt->execute();
    
    if ($stmt->fetch()) {
        throw new Exception('該關鍵字已在追蹤中');
    }
    
    // Insert new tracking
    $query = "INSERT INTO seo_tracking (brand_id, keyword, target_url, target_ranking, current_ranking, search_volume, competition, notes, tracking_date, created_at) 
              VALUES (:brand_id, :keyword, :target_url, :target_ranking, :current_ranking, :search_volume, :competition, :notes, CURDATE(), NOW())";
    $stmt = $db->prepare($query);
    $stmt->bindParam(':brand_id', $brand_id);
    $stmt->bindParam(':keyword', $keyword);
    $stmt->bindParam(':target_url', $target_url);
    $stmt->bindParam(':target_ranking', $target_ranking);
    $stmt->bindParam(':current_ranking', $current_ranking);
    $stmt->bindParam(':search_volume', $search_volume);
    $stmt->bindParam(':competition', $competition);
    $stmt->bindParam(':notes', $notes);
    
    if ($stmt->execute()) {
        $tracking_id = $db->lastInsertId();
        
        // Get the created tracking data
        $query = "SELECT st.*, b.name as brand_name FROM seo_tracking st 
                  LEFT JOIN brands b ON st.brand_id = b.id 
                  WHERE st.id = :tracking_id";
        $stmt = $db->prepare($query);
        $stmt->bindParam(':tracking_id', $tracking_id);
        $stmt->execute();
        $tracking = $stmt->fetch(PDO::FETCH_ASSOC);
        
        echo json_encode([
            'success' => true,
            'message' => '追蹤項目新增成功',
            'data' => $tracking
        ]);
    } else {
        throw new Exception('新增追蹤項目失敗');
    }
}

function updateTracking($db, $input) {
    $tracking_id = $input['tracking_id'] ?? '';
    $current_ranking = $input['current_ranking'] ?? null;
    $search_volume = $input['search_volume'] ?? null;
    $competition = $input['competition'] ?? null;
    $notes = $input['notes'] ?? null;
    
    if (empty($tracking_id)) {
        throw new Exception('缺少追蹤ID');
    }
    
    $updates = [];
    $params = [':tracking_id' => $tracking_id];
    
    if ($current_ranking !== null) {
        $updates[] = 'current_ranking = :current_ranking';
        $params[':current_ranking'] = $current_ranking;
    }
    
    if ($search_volume !== null) {
        $updates[] = 'search_volume = :search_volume';
        $params[':search_volume'] = $search_volume;
    }
    
    if ($competition !== null) {
        $updates[] = 'competition = :competition';
        $params[':competition'] = $competition;
    }
    
    if ($notes !== null) {
        $updates[] = 'notes = :notes';
        $params[':notes'] = $notes;
    }
    
    if (empty($updates)) {
        throw new Exception('沒有要更新的資料');
    }
    
    $updates[] = 'updated_at = NOW()';
    
    $query = "UPDATE seo_tracking SET " . implode(', ', $updates) . " WHERE id = :tracking_id";
    $stmt = $db->prepare($query);
    
    foreach ($params as $key => $value) {
        $stmt->bindValue($key, $value);
    }
    
    if ($stmt->execute()) {
        echo json_encode([
            'success' => true,
            'message' => '追蹤項目更新成功'
        ]);
    } else {
        throw new Exception('更新追蹤項目失敗');
    }
}

function deleteTracking($db, $input) {
    $tracking_id = $input['tracking_id'] ?? '';
    
    if (empty($tracking_id)) {
        throw new Exception('缺少追蹤ID');
    }
    
    $query = "DELETE FROM seo_tracking WHERE id = :tracking_id";
    $stmt = $db->prepare($query);
    $stmt->bindParam(':tracking_id', $tracking_id);
    
    if ($stmt->execute()) {
        echo json_encode([
            'success' => true,
            'message' => '追蹤項目刪除成功'
        ]);
    } else {
        throw new Exception('刪除追蹤項目失敗');
    }
}

function getTracking($db, $input) {
    $brand_id = $input['brand_id'] ?? '';
    $limit = $input['limit'] ?? 50;
    $offset = $input['offset'] ?? 0;
    
    $query = "SELECT st.*, b.name as brand_name FROM seo_tracking st 
              LEFT JOIN brands b ON st.brand_id = b.id";
    $params = [];
    
    if (!empty($brand_id)) {
        $query .= " WHERE st.brand_id = :brand_id";
        $params[':brand_id'] = $brand_id;
    }
    
    $query .= " ORDER BY st.tracking_date DESC LIMIT :limit OFFSET :offset";
    
    $stmt = $db->prepare($query);
    foreach ($params as $key => $value) {
        $stmt->bindValue($key, $value);
    }
    $stmt->bindValue(':limit', (int)$limit, PDO::PARAM_INT);
    $stmt->bindValue(':offset', (int)$offset, PDO::PARAM_INT);
    $stmt->execute();
    
    $tracking_data = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    // Get total count
    $count_query = "SELECT COUNT(*) FROM seo_tracking st";
    if (!empty($brand_id)) {
        $count_query .= " WHERE st.brand_id = :brand_id";
    }
    $count_stmt = $db->prepare($count_query);
    if (!empty($brand_id)) {
        $count_stmt->bindParam(':brand_id', $brand_id);
    }
    $count_stmt->execute();
    $total_count = $count_stmt->fetchColumn();
    
    echo json_encode([
        'success' => true,
        'data' => $tracking_data,
        'total' => $total_count,
        'limit' => $limit,
        'offset' => $offset
    ]);
}

function getAnalytics($db, $input) {
    $brand_id = $input['brand_id'] ?? '';
    $date_from = $input['date_from'] ?? date('Y-m-01'); // First day of current month
    $date_to = $input['date_to'] ?? date('Y-m-d'); // Today
    
    $where_conditions = ["st.tracking_date BETWEEN :date_from AND :date_to"];
    $params = [
        ':date_from' => $date_from,
        ':date_to' => $date_to
    ];
    
    if (!empty($brand_id)) {
        $where_conditions[] = "st.brand_id = :brand_id";
        $params[':brand_id'] = $brand_id;
    }
    
    $where_clause = "WHERE " . implode(' AND ', $where_conditions);
    
    // Get summary statistics
    $stats = [];
    
    // Total keywords
    $query = "SELECT COUNT(DISTINCT st.keyword) FROM seo_tracking st $where_clause";
    $stmt = $db->prepare($query);
    foreach ($params as $key => $value) {
        $stmt->bindValue($key, $value);
    }
    $stmt->execute();
    $stats['total_keywords'] = $stmt->fetchColumn();
    
    // Average ranking
    $query = "SELECT AVG(st.current_ranking) FROM seo_tracking st $where_clause AND st.current_ranking > 0";
    $stmt = $db->prepare($query);
    foreach ($params as $key => $value) {
        $stmt->bindValue($key, $value);
    }
    $stmt->execute();
    $stats['avg_ranking'] = round($stmt->fetchColumn(), 2);
    
    // Keywords in top 10
    $query = "SELECT COUNT(*) FROM seo_tracking st $where_clause AND st.current_ranking <= 10 AND st.current_ranking > 0";
    $stmt = $db->prepare($query);
    foreach ($params as $key => $value) {
        $stmt->bindValue($key, $value);
    }
    $stmt->execute();
    $stats['top_10_keywords'] = $stmt->fetchColumn();
    
    // Keywords in top 3
    $query = "SELECT COUNT(*) FROM seo_tracking st $where_clause AND st.current_ranking <= 3 AND st.current_ranking > 0";
    $stmt = $db->prepare($query);
    foreach ($params as $key => $value) {
        $stmt->bindValue($key, $value);
    }
    $stmt->execute();
    $stats['top_3_keywords'] = $stmt->fetchColumn();
    
    // Total search volume
    $query = "SELECT SUM(st.search_volume) FROM seo_tracking st $where_clause";
    $stmt = $db->prepare($query);
    foreach ($params as $key => $value) {
        $stmt->bindValue($key, $value);
    }
    $stmt->execute();
    $stats['total_search_volume'] = $stmt->fetchColumn();
    
    // Competition distribution
    $query = "SELECT st.competition, COUNT(*) as count FROM seo_tracking st $where_clause GROUP BY st.competition";
    $stmt = $db->prepare($query);
    foreach ($params as $key => $value) {
        $stmt->bindValue($key, $value);
    }
    $stmt->execute();
    $stats['competition_distribution'] = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    echo json_encode([
        'success' => true,
        'data' => $stats
    ]);
}

function getChartData($db, $input) {
    $brand_id = $input['brand_id'] ?? '';
    $chart_type = $input['chart_type'] ?? 'ranking_trend';
    $days = $input['days'] ?? 30;
    
    $date_from = date('Y-m-d', strtotime("-$days days"));
    $date_to = date('Y-m-d');
    
    $where_conditions = ["st.tracking_date BETWEEN :date_from AND :date_to"];
    $params = [
        ':date_from' => $date_from,
        ':date_to' => $date_to
    ];
    
    if (!empty($brand_id)) {
        $where_conditions[] = "st.brand_id = :brand_id";
        $params[':brand_id'] = $brand_id;
    }
    
    $where_clause = "WHERE " . implode(' AND ', $where_conditions);
    
    switch ($chart_type) {
        case 'ranking_trend':
            $query = "SELECT st.tracking_date, AVG(st.current_ranking) as avg_ranking 
                      FROM seo_tracking st $where_clause AND st.current_ranking > 0 
                      GROUP BY st.tracking_date ORDER BY st.tracking_date";
            break;
            
        case 'keyword_performance':
            $query = "SELECT st.keyword, st.current_ranking, st.target_ranking, st.search_volume 
                      FROM seo_tracking st $where_clause 
                      ORDER BY st.current_ranking ASC LIMIT 20";
            break;
            
        case 'competition_analysis':
            $query = "SELECT st.competition, COUNT(*) as count, AVG(st.current_ranking) as avg_ranking 
                      FROM seo_tracking st $where_clause 
                      GROUP BY st.competition";
            break;
            
        default:
            throw new Exception('無效的圖表類型');
    }
    
    $stmt = $db->prepare($query);
    foreach ($params as $key => $value) {
        $stmt->bindValue($key, $value);
    }
    $stmt->execute();
    $chart_data = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    echo json_encode([
        'success' => true,
        'data' => $chart_data,
        'chart_type' => $chart_type
    ]);
}

function exportData($db, $input) {
    $brand_id = $input['brand_id'] ?? '';
    $format = $input['format'] ?? 'csv';
    $date_from = $input['date_from'] ?? date('Y-m-01');
    $date_to = $input['date_to'] ?? date('Y-m-d');
    
    $where_conditions = ["st.tracking_date BETWEEN :date_from AND :date_to"];
    $params = [
        ':date_from' => $date_from,
        ':date_to' => $date_to
    ];
    
    if (!empty($brand_id)) {
        $where_conditions[] = "st.brand_id = :brand_id";
        $params[':brand_id'] = $brand_id;
    }
    
    $where_clause = "WHERE " . implode(' AND ', $where_conditions);
    
    $query = "SELECT st.*, b.name as brand_name FROM seo_tracking st 
              LEFT JOIN brands b ON st.brand_id = b.id 
              $where_clause ORDER BY st.tracking_date DESC";
    
    $stmt = $db->prepare($query);
    foreach ($params as $key => $value) {
        $stmt->bindValue($key, $value);
    }
    $stmt->execute();
    $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    if ($format === 'csv') {
        header('Content-Type: text/csv');
        header('Content-Disposition: attachment; filename="seo_tracking_' . date('Y-m-d') . '.csv"');
        
        $output = fopen('php://output', 'w');
        
        // CSV headers
        fputcsv($output, [
            'ID', '品牌', '關鍵字', '目標網址', '目標排名', '目前排名', 
            '搜尋量', '競爭度', '備註', '追蹤日期', '建立時間'
        ]);
        
        // CSV data
        foreach ($data as $row) {
            fputcsv($output, [
                $row['id'],
                $row['brand_name'],
                $row['keyword'],
                $row['target_url'],
                $row['target_ranking'],
                $row['current_ranking'],
                $row['search_volume'],
                $row['competition'],
                $row['notes'],
                $row['tracking_date'],
                $row['created_at']
            ]);
        }
        
        fclose($output);
    } else {
        echo json_encode([
            'success' => true,
            'data' => $data
        ]);
    }
}
?>
