// 每一 describe 就是一個測試套件
// 每一 it 就是一個測試命令
describe('Save Log and Filter', ()=>{
  beforeEach(() => {
    cy.visit('https://REDACTED-HOST/files');
    cy.login();
    cy.visit('https://REDACTED-HOST/files');

    // enter log
    cy.url().should('include', 'files');
    cy.contains('.fileName', 'random').dblclick(); // 選取 'random' log 檔
    cy.contains('h2', 'DISCOVER'); // 斷言在 Discover 頁
    cy.url().should('include', 'discover/map/log'); // 斷言在 discover/map/log/:id 路徑
    cy.wait(3000)
    cy.get('#iconFilter').click(); // 選取 Filter sidebar
  });

  it('Sequence, Have activity(s).', () => {
    // select radio
    cy.get('input#Sequence0').should('be.checked'); // 選取 Radio 'Sequence'
    cy.contains('label', 'Have activity(s)') // 選取 Radio 'Have activity(s)'
      .prev(2)
      .find('input')
      .should('have.attr', 'type', 'radio') // select the previous element
      .should('be.checked'); // confirm it's type radio (optional)

    // No selected.
    cy.contains('button', 'Apply').click();
    cy.get('.v-toast__text').should('contain', 'Not selected');
    cy.wait(3000);

    // Clear selected item.
    cy.get('.allCheckboxAct') // 選取 all select
      .find('input')
      .should('not.be.visible').check({ force: true}).should('be.checked'); // 打開隱藏項目並選取
    cy.contains('button', 'Clear').click();
    cy.get('.allCheckboxAct') // 選取 all select
      .find('input')
      .should('not.be.visible')
      .should('not.be.checked')
    cy.wait(3000);

    // selected item
    cy.get('table tr:nth-child(2) input[type="checkbox"]').check({force: true});
    cy.contains('button', 'Apply').click();
    cy.get('#tabFunnel').click();
    cy.contains('p', 'Sequence');
    cy.contains('span', 'Include');
    cy.contains('button', 'Apply All').click();

    // make sure create map again.
    cy.get('header').click();
    cy.get('#iconState').click();
    cy.get('li').first().then($li => { // then() 獲取 <li> 元素的內容
      const percentage = $li.find('span').eq(1).text(); // li 底下找到第二個 span
      expect(percentage).not.to.equal('100%'); // text !== 100% 來判斷數據是否有變化
    });
  });

  it('Sequence, Start', () => {
    // select radio
    cy.get('input#Sequence0').should('be.checked'); // 選取 Radio 'Sequence'
    cy.contains('label', 'Start activity / End activity') // 選取 Radio 'Have activity(s)'
      .prev(2)
      .find('input')
      .should('have.attr', 'type', 'radio') // select the previous element
      .check({ force: true })
      .should('be.checked'); // confirm it's type radio (optional)

    // No selected.
    cy.contains('button', 'Apply').click();
    cy.get('.v-toast__text').should('contain', 'Not selected');
    cy.wait(3000);

    // Clear selected item.
    cy.get('table tr:nth-child(2) input[type="radio"]').check({force: true}); // 選取第二個
    cy.contains('button', 'Clear').click();
    cy.get('table tr:nth-child(2) input[type="radio"]').should('not.be.checked')
    cy.wait(3000);

    // selected item
    cy.get('table tr:nth-child(2) input[type="radio"]').check({force: true});
    cy.contains('button', 'Apply').click();
    cy.get('#tabFunnel').click();
    cy.contains('p', 'Sequence');
    cy.contains('span', 'Start');
    cy.contains('button', 'Apply All').click();

    //make sure create map again.
    cy.get('header').click();
    cy.get('#iconState').click();
    cy.get('li').first().then($li => { // then() 獲取 <li> 元素的內容
      const percentage = $li.find('span').eq(1).text(); // li 底下找到第二個 span
      expect(percentage).not.to.equal('100%'); // text !== 100% 來判斷數據是否有變化
    });
  });

  it('Sequence, End', () => {
    // select radio
    cy.get('input#Sequence0').should('be.checked'); // 選取 Radio 'Sequence'
    cy.contains('label', 'Start activity / End activity') // 選取 Radio 'Have activity(s)'
      .prev(2)
      .find('input')
      .should('have.attr', 'type', 'radio') // select the previous element
      .check({ force: true })
      .should('be.checked'); // confirm it's type radio (optional)
    cy.get('input#End1').check({ force: true });

    // No selected.
    cy.contains('button', 'Apply').click();
    cy.get('.v-toast__text').should('contain', 'Not selected');
    cy.wait(3000);

    // Clear selected item.
    cy.get('table tr:nth-child(1) input[type="radio"]').check({force: true}); // 選取第一個
    cy.contains('button', 'Clear').click();
    cy.get('table tr:nth-child(1) input[type="radio"]').should('not.be.checked')
    cy.wait(3000);

    // selected item
    cy.get('table tr:nth-child(2) input[type="radio"]').check({force: true});
    cy.contains('button', 'Apply').click();
    cy.get('#tabFunnel').click();
    cy.contains('p', 'Sequence');
    cy.contains('span', 'End');
    cy.contains('button', 'Apply All').click();

    // make sure create map again.
    cy.get('header').click();
    cy.get('#iconState').click();
    cy.get('li').first().then($li => { // then() 獲取 <li> 元素的內容
      const percentage = $li.find('span').eq(1).text(); // li 底下找到第二個 span
      expect(percentage).not.to.equal('100%'); // text !== 100% 來判斷數據是否有變化
    });
  });

  it('Sequence, Start & End', () => {
    // select radio
    cy.get('input#Sequence0').should('be.checked'); // 選取 Radio 'Sequence'
    cy.contains('label', 'Start activity / End activity') // 選取 Radio 'Have activity(s)'
      .prev(2)
      .find('input')
      .should('have.attr', 'type', 'radio') // select the previous element
      .check({ force: true })
      .should('be.checked'); // confirm it's type radio (optional)
    cy.get('input[id="Start & End2"]').check({ force: true });

    // No selected.
    cy.contains('button', 'Apply').click();
    cy.get('.v-toast__text').should('contain', 'Both Start and End must be selected');
    cy.wait(3000);

    // 選取 "start" 的 <table>
    cy.contains('p', 'Start activity')
      .parents('div') // 回到 p 的父層 div
      .eq(1) // 同階層的第二個 div
      .find('table') // 向下找 table
      .as('startTable'); // 將選取的元素命名，使用 @startTable 來操作
    // 選取 "end" 的 <table>
    cy.contains('p', 'End activity')
      .parents('div')
      .eq(1)
      .find('table')
      .as('endTable'); // 使用 @endTable 來操作

    // Clear selected item.
    cy.get('@startTable').find('tr:nth-child(1) input[type="radio"]').check({ force: true });
    cy.get('@endTable').find('tr:nth-child(1) input[type="radio"]').check({ force: true });
    cy.contains('button', 'Clear').click();
    cy.get('@startTable').find('tr:nth-child(1) input[type="radio"]').should('not.be.checked');
    cy.get('@endTable').find('tr:nth-child(1) input[type="radio"]').should('not.be.checked');
    cy.wait(3000);

    // selected item
    cy.get('@startTable').find('tr:nth-child(1) input[type="radio"]').check({ force: true });
    cy.get('@endTable').find('tr:nth-child(1) input[type="radio"]').check({ force: true });
    cy.contains('button', 'Apply').click();
    cy.get('#tabFunnel').click();
    cy.contains('p', 'Sequence');
    cy.contains('span', 'Start')
      .parent()
      .contains('span', 'End'); // 斷言 text 是否包含 Start 和 End.
    cy.contains('button', 'Apply All').click();

    // make sure create map again.
    cy.get('header').click();
    cy.get('#iconState').click();
    cy.get('li').first().then($li => { // then() 獲取 <li> 元素的內容
      const percentage = $li.find('span').eq(1).text(); // li 底下找到第二個 span
      expect(percentage).not.to.equal('100%'); // text !== 100% 來判斷數據是否有變化
    });
  });

  it('Sequence, Sequence', () => {
    // select radio
    cy.get('input#Sequence0').should('be.checked'); // 選取 Radio 'Sequence'
    cy.contains('p', 'Activity Sequence') // 選取包含指定文字的元素
    .nextAll() // 選取所有後續相鄰元素
    .eq(2) // 選取索引為 2 , 下 3 個相鄰元素
    .find('input#Sequence2') // 在下一個相鄰元素中尋找指定的 <input> 元素
    .check({ force: true }); // 對該 <input> 元素進行勾選操作

    // No selected.
    cy.contains('button', 'Apply').click();
    cy.get('.v-toast__text').should('contain', 'Select two or more');
    cy.wait(3000);

    // 使用 dblclick 選擇要拖曳的元素
    cy.get('tbody tr[data-draggable="true"]').first().dblclick();
    cy.get('.listSequence').find('div[data-draggable="true"]').should('exist');
    cy.contains('button', 'Clear').click();
    cy.get('.listSequence').find('div[data-draggable="true"]').should('not.exist');
    cy.get('.v-toast__text').should('contain', 'Reset Success');
    cy.wait(3000);


    // 設定傳給後端的 listSequence
    cy.get('tbody tr[data-draggable="true"]').eq(0).dblclick(); // 第 1 個 tr
    cy.get('tbody tr[data-draggable="true"]').eq(1).dblclick(); // 第 2 個 tr
    cy.contains('button', 'Apply').click();
    cy.get('#tabFunnel').click();
    cy.contains('p', 'Sequence');
    cy.contains('span', 'Directly-follows');
    cy.contains('button', 'Apply All').click();

    // make sure create map again.
    cy.get('header').click();
    cy.get('#iconState').click();
    cy.get('li').first().then($li => { // then() 獲取 <li> 元素的內容
      const percentage = $li.find('span').eq(1).text(); // li 底下找到第二個 span
      expect(percentage).not.to.equal('100%'); // text !== 100% 來判斷數據是否有變化
    });
  });

  it('Trace', () => {
    // select radio
    cy.get('input#Trace2').check({ force: true }); // 選取 Radio 'Trace'
    cy.wait(3000);

    // click on Trace Number to show a table
    cy.contains('td', '#1').click();
    cy.wait(1000);
    cy.get('#cyTrace').scrollIntoView().should('be.visible'); // 視窗滾到右邊
    cy.wait(1000);
    cy.get('.p-chart').scrollIntoView(); // 視窗拉回來

    // Clear selected item
    cy.get('.p-slider-handle:nth-child(2)')
      .click()
      .trigger('mousedown', { which: 1 })
      .trigger('mousemove', { clientX: 250 })
      .xpath('//span[contains(@class, "p-slider-handle")][2]')
      .click()
      .trigger('mouseup');
    cy.contains('button', 'Clear').click();
    cy.get('.v-toast__text').should('contain', 'Reset Success');
    cy.wait(3000);

    // selected item
    cy.get('.p-slider-handle:nth-child(2)')
      .click()
      .trigger('mousedown', { which: 1 })
      .trigger('mousemove', { clientX: 250 })
      .xpath('//span[contains(@class, "p-slider-handle")][2]')
      .click()
      .trigger('mouseup');
    cy.contains('button', 'Apply').click();
    cy.get('#tabFunnel').click();
    cy.contains('p', 'Trace');
    cy.contains('button', 'Apply All').click();

    // make sure create map again.
    cy.get('header').click();
    cy.get('#iconState').click();
    cy.get('li').first().then($li => { // then() 獲取 <li> 元素的內容
      const percentage = $li.find('span').eq(1).text(); // li 底下找到第二個 span
      expect(percentage).not.to.equal('100%'); // text !== 100% 來判斷數據是否有變化
    });
  });

  it('Timeframes', () => {
    // select radio
    cy.get('input#Timeframes3').check({ force: true }); // 選取 Radio 'Trace'
    cy.wait(3000);

    // Clear selected item
    cy.get('#startCalendar').click();
    cy.get('.p-datepicker td[aria-label="28"]').click({ multiple: true });
    cy.contains('button', 'Clear').click();
    cy.get('.v-toast__text').should('contain', 'Reset Success');
    cy.wait(3000);

    // selected item
    cy.get('#startCalendar').click();
    cy.get('.p-datepicker td[aria-label="28"]').click({ multiple: true });
    cy.contains('button', 'Apply').click();
    cy.get('#tabFunnel').click();
    cy.contains('p', 'Timeframe');
    cy.contains('button', 'Apply All').click();

    // make sure create map again.
    cy.get('header').click();
    cy.get('#iconState').click();
    cy.get('li').first().then($li => { // then() 獲取 <li> 元素的內容
      const percentage = $li.find('span').eq(1).text(); // li 底下找到第二個 span
      expect(percentage).not.to.equal('100%'); // text !== 100% 來判斷數據是否有變化
    });
  });

});
