// ====== ** Thay đổi thông tin test ở đây ** ======

// Trình duyệt test
const Browser = 'chrome';    // Lựa chọn: chrome, firefox
const DOMAIN = "https://demopc8.hurasoft.com/?show_template=xstore"; // Tên miền
var text_search = 'case';       // Từ khóa tìm kiếm
var productNameClass = '.p-name';    // Class chứa url sản phẩm
var buttonAddProductId = '#add_to_cart' // Id/class nút thêm sp vào giỏ ở trang chi tiết sản phẩm

// Thông tin người dùng, sử dụng để nhập vào form: Mua hàng, đăng ký, đăng nhập, bình luận,.....
var user_name = 'Test giỏ hàng';          // ==== Tên
var user_email = 'test@mail.com';          // ==== Email
var user_mobile = '0987654321';             // ==== Số điện thoại
var user_address = 'Số 3 ngõ 18 Yên Lãng';   // ==== Địa chỉ
var user_province = 'Hà Nội';                 // ==== Tỉnh/Thành phố
var user_district = 'Quận Đống Đa';           // ==== Quận/Huyện
var user_ward = 'Phường Láng Hạ';         // ==== Phường/Xã
var user_content = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'; // Nội dung
// ============================================================================================================


// ==================================== ** KHÔNG THAY ĐỔI ** ====================================
const { Builder, By, Select, until, implicitlyWait } = require("selenium-webdriver");
const { Driver } = require("selenium-webdriver/chrome");

require('chromedriver');
require('selenium-webdriver/chrome');

(async function AddToCartTest() {

    let driver = await new Builder().forBrowser(Browser).build();

    try {
        // Setup
        await driver.get(DOMAIN);
        await driver.manage().window().maximize();
        await driver.manage().setTimeouts({ implicit: 3000, pageLoad: 3000, script: 3000 })

        driver.executeScript(`
            var jquery_script = document.createElement('script');
            jquery_script.src = 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.3/jquery.min.js';
            document.getElementsByTagName('head')[0].appendChild(jquery_script);
        `)

        driver.executeScript('$ = window.jQuery;'); // Load jQuery
        // == End Setup



        // 1. Header: Tìm kiếm sp
        var input_search = await driver.findElement(By.xpath("//input[@name='q']"));

        await testSearchWeb(driver, text_search, input_search).then(function redirectProductDetail() {
            goToProductDetail(driver, productNameClass);
        });


        // 2. Chi tiết sp: Thêm sp vào giỏ
        await driver.wait(until.elementLocated(By.css(buttonAddProductId))).click();


        // 3. Giỏ hàng: Gửi đơn hàng
        await submitCartForm(driver);


    } finally {


        checkListWeb(driver);


        setTimeout(() => {

            driver.quit();

        }, 5000)
    }

})();

// == Header: Test hiển thị danh sách sản phẩm tìm kiếm
async function testSearchWeb(driver, text_search, input_search) {
    await driver.actions()
        .move({ origin: input_search })
        .pause(1000)
        .doubleClick()
        .sendKeys(text_search)
        .pause(2000)
        .perform();

    await driver.findElement(By.xpath("//button[@type='submit']")).click(); //== Kiểm tra đến trang tìm kiếm                                        

    await checkListWeb(driver);
}

// == Ô sản phẩm: Điều hướng đến trang chi tiết sản phẩm
async function goToProductDetail(driver, productNameClass) {
    var productUrl = driver.findElement(By.css(productNameClass));
    await driver.actions()
        .move({ origin: productUrl })
        .pause(1000)
        .press()
        .perform();

    await productUrl.click();

    await checkListWeb(driver);
}

// == Giỏ hàng: Nhập thông tin người dùng và gửi
async function submitCartForm(driver) {
    await driver.findElement(By.xpath("//input[@name='user_info[name]']")).sendKeys(user_name);
    await driver.findElement(By.xpath("//input[@name='user_info[email]']")).sendKeys(user_email);
    await driver.findElement(By.xpath("//input[@name='user_info[mobile]']")).sendKeys(user_mobile);
    await driver.findElement(By.xpath("//input[@name='user_info[address]']")).sendKeys(user_address);
    await new Select(driver.findElement(By.xpath("//select[@name='user_info[province]']"))).selectByVisibleText(user_province);
    await new Select(driver.findElement(By.xpath("//select[@name='user_info[district]']"))).selectByVisibleText(user_district);
    await new Select(driver.findElement(By.xpath("//select[@name='user_info[ward]']"))).selectByVisibleText(user_ward);

    await driver.findElement(By.css("form[action='/send-cart']")).submit();

    await checkListWeb(driver);
}


// Hiển thị bảng danh sách test
async function checkListWeb(driver) {
    await driver.executeScript(CreateTableCheck);

    await driver.executeScript(checkSearch, check_list);

    await driver.executeScript(checkAddCart, check_list);

    await driver.executeScript(checkSendCart, check_list);
}


function CreateTableCheck() {
    var table_container = document.createElement('div');

    table_container.id = 'js-table-container';

    document.body.appendChild(table_container);

    $("#js-table-container").html(`
        <style>#js-table-check td, #js-table-check th {border: 1px solid #ccc;padding: 7px 10px;}</style>

        <div id="js-table-check" style="position:fixed;left:10px;bottom:50px;z-index: 999;background:#fff;box-shadow:0 1px 5px rgb(0 0 0 / 30%);padding:10px;">
            <table>
                <thead>
                    <tr align="center"><th>Danh sách</th> <th>Trạng thái</th></tr>
                </thead>

                <tbody> <!-- //check list --> </tbody>
            </table>
        </div>
  `);
}

var check_list = 'function checkListFormFunc(condition, results) {if (condition) {$("#js-table-check tbody").append(`<tr><td>${results}:</td> <td align="center" style="font-weight:700;color:green;">OK</td></tr>`)} else {$("#js-table-check tbody").append(`<tr><td>${results}:</td> <td align="center" style="font-weight:700;color:red;">FALSE</td></tr>`)}}';

var tableCheck = '$("#js-table-check")';

// ============= *** Danh sách kiểm tra *** =============

// Kiểm tra tìm kiếm
function checkSearch(check_list, text_search) {
    eval(check_list);
    var check_input = '';
    var current_url = location.search;

    if (current_url.includes = '?q=' + text_search || $('input[name="q"]').val() != '') {
        check_input = 'ok';
    }

    checkListFormFunc(check_input !== '', 'Kiểm tra tìm kiếm sản phẩm')
}

// Kiểm tra thêm sản phẩm vào giỏ hàng
function checkAddCart(check_list) {
    eval(check_list);

    var current_url = location.pathname;
    var check_quantity = '';

    if (current_url == '/cart' || current_url == '/send-cart') {
        check_quantity = 'ok';
    }

    checkListFormFunc(check_quantity !== '', 'Kiểm tra thêm sản phẩm vào giỏ hàng');
}

// Kiểm tra gửi đơn hàng
function checkSendCart(check_list) {
    eval(check_list);
    var check_sendCart = $('.content-send h1').text().trim();
    var check_text = '';

    if (check_sendCart == 'Đặt hàng thành công') {
        check_text = 'Đặt hàng thành công'
    }

    checkListFormFunc(check_text !== '', 'Kiểm tra gửi đơn hàng');
}