# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/

require 'browser_test_helper'

class AgentTicketOverviewLevel0Test < TestCase
  def test_bulk_close
    @browser = browser_instance
    login(
      username: 'admin@example.com',
      password: 'test',
      url:      browser_url,
    )
    tasks_close_all

    # test bulk action

    # create new ticket
    ticket1 = ticket_create(
      data: {
        customer: 'nico',
        group:    'Users',
        title:    'overview count test #1',
        body:     'overview count test #1',
      }
    )
    ticket2 = ticket_create(
      data: {
        customer: 'nico',
        group:    'Users',
        title:    'overview count test #2',
        body:     'overview count test #2',
      }
    )
    click(text: 'Overviews')

    # enable full overviews
    execute(
      js: '$(".content.active .sidebar").css("display", "block")',
    )

    click(text: 'Unassigned & Open')
    watch_for(
      css:   '.content.active',
      value: 'overview count test #2',
    )

    # select both via bulk action
    click(
      css:  %(.content.active table tr td input[value="#{ticket1[:id]}"]),
      fast: true,
    )

    # scroll to reply - needed for chrome
    scroll_to(
      position: 'top',
      css:      %(.content.active table tr td input[value="#{ticket2[:id]}"]),
    )
    click(
      css:  %(.content.active table tr td input[value="#{ticket2[:id]}"]),
      fast: true,
    )

    exists(
      css: %(.content.active table tr td input[value="#{ticket1[:id]}"][type="checkbox"]:checked),
    )
    exists(
      css: %(.content.active table tr td input[value="#{ticket2[:id]}"][type="checkbox"]:checked),
    )

    # remember current overview count
    overview_counter_before = overview_counter

    # select close state & submit
    select(
      css:   '.content.active .bulkAction [name="state_id"]',
      value: 'closed',
    )
    click(
      css: '.content.active .bulkAction .js-confirm',
    )
    click(
      css: '.content.active .bulkAction .js-submit',
    )

    watch_for_disappear(
      css:     %(.content.active table tr td input[value="#{ticket2[:id]}"]),
      timeout: 12,
    )

    exists_not(
      css: %(.content.active table tr td input[value="#{ticket1[:id]}"]),
    )
    exists_not(
      css: %(.content.active table tr td input[value="#{ticket2[:id]}"]),
    )

    # remember current overview count
    await_overview_counter(view: '#ticket/view/all_unassigned', count: overview_counter_before['#ticket/view/all_unassigned'] - 2)
    overview_counter_before = overview_counter

    # click options and enable number and article count
    click(css: '.content.active [data-type="settings"]')

    modal_ready

    check(
      css: '.modal input[value="number"]',
    )
    check(
      css: '.modal input[value="title"]',
    )
    check(
      css: '.modal input[value="customer"]',
    )
    check(
      css: '.modal input[value="group"]',
    )
    check(
      css: '.modal input[value="created_at"]',
    )
    check(
      css: '.modal input[value="article_count"]',
    )
    click(css: '.modal .js-submit')
    modal_disappear

    # check if number and article count is shown
    match(
      css:   '.content.active table th:nth-child(3)',
      value: '#',
    )
    match(
      css:   '.content.active table th:nth-child(4)',
      value: 'Title',
    )
    match(
      css:   '.content.active table th:nth-child(7)',
      value: 'Article#',
    )

    # reload browser
    reload
    sleep 4

    # check if number and article count is shown
    match(
      css:   '.content.active table th:nth-child(3)',
      value: '#',
    )
    match(
      css:   '.content.active table th:nth-child(4)',
      value: 'Title',
    )
    match(
      css:   '.content.active table th:nth-child(7)',
      value: 'Article#',
    )

    # disable number and article count
    click(css: '.content.active [data-type="settings"]')

    modal_ready

    uncheck(
      css: '.modal input[value="number"]',
    )
    uncheck(
      css: '.modal input[value="article_count"]',
    )
    click(css: '.modal .js-submit')
    modal_disappear

    # check if number and article count is gone
    match_not(
      css:   '.content.active table th:nth-child(3)',
      value: '#',
    )
    match(
      css:   '.content.active table th:nth-child(3)',
      value: 'Title',
    )
    exists_not(
      css: '.content.active table th:nth-child(8)',
    )

    # create new ticket
    ticket3 = ticket_create(
      data: {
        customer: 'nico',
        group:    'Users',
        title:    'overview count test #3',
        body:     'overview count test #3',
      }
    )

    # get new overview count
    await_overview_counter(view: '#ticket/view/all_unassigned', count: overview_counter_before['#ticket/view/all_unassigned'] + 1)

    # open ticket by search
    ticket_open_by_search(
      number: ticket3[:number],
    )
    sleep 1

    # close ticket
    ticket_update(
      data: {
        state: 'closed',
      }
    )

    # get current overview count
    await_overview_counter(view: '#ticket/view/all_unassigned', count: overview_counter_before['#ticket/view/all_unassigned'])

    # cleanup
    tasks_close_all
  end

  def test_bulk_pending
    @browser = browser_instance
    login(
      username: 'admin@example.com',
      password: 'test',
      url:      browser_url,
    )
    tasks_close_all

    # test bulk action

    # create new ticket
    ticket1 = ticket_create(
      data: {
        customer: 'nico',
        group:    'Users',
        title:    'overview count test #3',
        body:     'overview count test #3',
      }
    )
    ticket2 = ticket_create(
      data: {
        customer: 'nico',
        group:    'Users',
        title:    'overview count test #4',
        body:     'overview count test #4',
      }
    )
    click(text: 'Overviews')

    # enable full overviews
    execute(
      js: '$(".content.active .sidebar").css("display", "block")',
    )

    click(text: 'Unassigned & Open')
    watch_for(
      css:     '.content.active',
      value:   'overview count test #4',
      timeout: 8,
    )

    # remember current overview count
    overview_counter_before = overview_counter

    # select both via bulk action
    click(
      css:  %(.content.active table tr td input[value="#{ticket1[:id]}"]),
      fast: true,
    )

    # scroll to reply - needed for chrome
    scroll_to(
      position: 'top',
      css:      %(.content.active table tr td input[value="#{ticket2[:id]}"]),
    )
    click(
      css:  %(.content.active table tr td input[value="#{ticket2[:id]}"]),
      fast: true,
    )

    exists(
      css: %(.content.active table tr td input[value="#{ticket1[:id]}"][type="checkbox"]:checked),
    )
    exists(
      css: %(.content.active table tr td input[value="#{ticket2[:id]}"][type="checkbox"]:checked),
    )

    exists(
      displayed: false,
      css:       '.content.active .bulkAction [data-name="pending_time"]',
    )

    select(
      css:   '.content.active .bulkAction [name="state_id"]',
      value: 'pending close',
    )

    exists(
      displayed: true,
      css:       '.content.active .bulkAction [data-name="pending_time"]',
    )

    set(
      css:   '.content.active .bulkAction [data-item="date"]',
      value: '05/23/2037',
    )

    select(
      css:   '.content.active .bulkAction [name="group_id"]',
      value: 'Users',
    )

    select(
      css:   '.content.active .bulkAction [name="owner_id"]',
      value: 'Test Admin Agent',
    )

    click(
      css: '.content.active .bulkAction .js-confirm',
    )
    click(
      css: '.content.active .bulkAction .js-submit',
    )

    watch_for_disappear(
      css:     %(.content.active table tr td input[value="#{ticket2[:id]}"]),
      timeout: 12,
    )

    exists_not(
      css: %(.content.active table tr td input[value="#{ticket1[:id]}"]),
    )
    exists_not(
      css: %(.content.active table tr td input[value="#{ticket2[:id]}"]),
    )

    # get new overview count
    await_overview_counter(view: '#ticket/view/all_unassigned', count: overview_counter_before['#ticket/view/all_unassigned'] - 2)

    # open ticket by search
    ticket_open_by_search(
      number: ticket1[:number],
    )
    sleep 1

    # close ticket
    ticket_update(
      data: {
        state: 'closed',
      }
    )

    # open ticket by search
    ticket_open_by_search(
      number: ticket2[:number],
    )
    sleep 1

    # close ticket
    ticket_update(
      data: {
        state: 'closed',
      }
    )

    # cleanup
    tasks_close_all
  end

  # verify correct behaviour for issue #1864 - Bulk-Action: Not possible to change owner
  def test_bulk_owner_change
    @browser = browser_instance
    login(
      username: 'admin@example.com',
      password: 'test',
      url:      browser_url,
    )
    tasks_close_all

    # test bulk action

    # create new ticket
    ticket1 = ticket_create(
      data: {
        customer: 'nico',
        group:    'Users',
        title:    'overview owner change test #1',
        body:     'overview owner change #1',
      }
    )
    ticket2 = ticket_create(
      data: {
        customer: 'nico',
        group:    'Users',
        title:    'overview owner change #2',
        body:     'overview owner change #2',
      }
    )

    overview_open(
      link:    '#ticket/view/all_unassigned',
    )

    watch_for(
      css:     '.content.active',
      value:   'overview owner change #2',
      timeout: 8,
    )

    # remember current overview count
    overview_counter_before = overview_counter

    # select both via bulk action
    click(
      css:  %(.content.active table tr td input[value="#{ticket1[:id]}"]),
      fast: true,
    )

    # scroll to reply - needed for chrome
    scroll_to(
      position: 'top',
      css:      %(.content.active table tr td input[value="#{ticket2[:id]}"]),
    )
    click(
      css:  %(.content.active table tr td input[value="#{ticket2[:id]}"]),
      fast: true,
    )

    exists(
      css: %(.content.active table tr td input[value="#{ticket1[:id]}"][type="checkbox"]:checked),
    )
    exists(
      css: %(.content.active table tr td input[value="#{ticket2[:id]}"][type="checkbox"]:checked),
    )

    select(
      css:   '.content.active .bulkAction [name="owner_id"]',
      value: 'Test Admin Agent',
    )

    select(
      css:   '.content.active .bulkAction [name="state_id"]',
      value: 'closed',
    )

    click(
      css: '.content.active .bulkAction .js-confirm',
    )
    click(
      css: '.content.active .bulkAction .js-submit',
    )

    watch_for_disappear(
      css:     %(.content.active table tr td input[value="#{ticket2[:id]}"]),
      timeout: 12,
    )

    exists_not(
      css: %(.content.active table tr td input[value="#{ticket1[:id]}"]),
    )
    exists_not(
      css: %(.content.active table tr td input[value="#{ticket2[:id]}"]),
    )

    # get new overview count
    await_overview_counter(view: '#ticket/view/all_unassigned', count: overview_counter_before['#ticket/view/all_unassigned'] - 2)

    # cleanup
    tasks_close_all
  end

  # verify fix for issue #2026 - Bulk action should not be shown if user has no change permissions
  def test_no_bulk_action_when_missing_change_permission
    @browser = browser_instance
    login(
      username: 'admin@example.com',
      password: 'test',
      url:      browser_url,
    )
    tasks_close_all

    # create new group
    group_create(
      data: {
        name: 'some group2',
      },
    )

    role_edit(
      data: {
        name:              'Agent',
        group_permissions: { 2 => ['full'],
                             3 => ['full'], }
      },
    )

    user_edit(
      data: {
        login:       'admin@example.com',
        permissions: { 1 => ['full'],
                       2 => ['full'],
                       3 => ['full'], }
      },
    )

    user_create(
      data: {
        firstname:   'Tester',
        lastname:    'Agent 2',
        email:       'agent2@example.com',
        password:    'test',
        role:        'Agent',
        permissions: { 1 => %w[read create overview] }
      },
    )

    # create new tickets
    can_change_ticket = ticket_create(
      data: {
        customer: 'nico',
        group:    'some group2',
        title:    'overview test #5',
        body:     'overview test #5',
      }
    )
    cannot_change_ticket = ticket_create(
      data: {
        customer: 'nico',
        group:    'Users',
        title:    'overview test #6',
        body:     'overview test #6',
      }
    )

    logout # logout as admin@example.com then login as agent2@example.com
    login(
      username: 'agent2@example.com',
      password: 'test',
      url:      browser_url,
    )
    tasks_close_all

    # open Overview menu tab
    click(
      css: '.js-menu .js-overviewsMenuItem',
    )

    # enable full overviews
    execute(
      js: '$(".content.active .sidebar").css("display", "block")',
    )

    # click Unassigned & Open tab
    click(
      css: '.content.active [href="#ticket/view/all_unassigned"]',
    )

    watch_for(
      css:     '.content.active',
      value:   'overview test #6',
      timeout: 8,
    )

    # first select the ticket that we have change rights to
    check(
      css: %(.content.active table tr td input[value="#{can_change_ticket[:id]}"]),
    )

    # check that the bulk action form appears
    exists(
      displayed: true,
      css:       '.content.active .bulkAction',
    )

    # then select the ticket that we do not have change rights to
    scroll_to(
      position: 'top',
      css:      %(.content.active table tr td input[value="#{cannot_change_ticket[:id]}"]),
    )
    check(
      css: %(.content.active table tr td input[value="#{cannot_change_ticket[:id]}"]),
    )

    # check that the bulk action form disappears
    exists(
      displayed: false,
      css:       '.content.active .bulkAction',
    )

    # de-select the ticket that we do not have change rights to
    uncheck(
      css:  %(.content.active table tr td input[value="#{cannot_change_ticket[:id]}"]),
      fast: true,
    )

    # check that the bulk action form appears again
    exists(
      displayed: true,
      css:       '.content.active .bulkAction',
    )

    # de-select the ticket that we have change rights to
    uncheck(
      css:  %(.content.active table tr td input[value="#{can_change_ticket[:id]}"]),
      fast: true,
    )

    # check that the bulk action form disappears again
    exists(
      displayed: false,
      css:       '.content.active .bulkAction',
    )

    # cleanup
    tasks_close_all
    logout # logout as agent2@example.com and then login as admin@example.com to clean up tickets
    login(
      username: 'admin@example.com',
      password: 'test',
      url:      browser_url,
    )
    tasks_close_all

    # open ticket by search
    ticket_open_by_search(
      number: cannot_change_ticket[:number],
    )
    sleep 1

    # close ticket
    ticket_update(
      data: {
        state: 'closed',
      }
    )

    # open ticket by search
    ticket_open_by_search(
      number: can_change_ticket[:number],
    )
    sleep 1

    # close ticket
    ticket_update(
      data: {
        state: 'closed',
      }
    )
  end
end