# encoding: utf-8
require 'test_helper'

class TicketTest < ActiveSupport::TestCase
  test 'ticket create' do
    ticket = Ticket.create(
      title: "some title\n äöüß",
      group: Group.lookup( name: 'Users'),
      customer_id: 2,
      state: Ticket::State.lookup( name: 'new' ),
      priority: Ticket::Priority.lookup( name: '2 normal' ),
      updated_by_id: 1,
      created_by_id: 1,
    )
    assert( ticket, 'ticket created' )

    assert_equal( ticket.title, 'some title  äöüß', 'ticket.title verify' )
    assert_equal( ticket.group.name, 'Users', 'ticket.group verify' )
    assert_equal( ticket.state.name, 'new', 'ticket.state verify' )

    # create inbound article
    article_inbound = Ticket::Article.create(
      ticket_id: ticket.id,
      from: 'some_sender@example.com',
      to: 'some_recipient@example.com',
      subject: 'some subject',
      message_id: 'some@id',
      body: 'some message article_inbound 😍😍😍',
      internal: false,
      sender: Ticket::Article::Sender.where(name: 'Customer').first,
      type: Ticket::Article::Type.where(name: 'email').first,
      updated_by_id: 1,
      created_by_id: 1,
    )
    assert_equal( article_inbound.body, 'some message article_inbound 😍😍😍'.utf8_to_3bytesutf8, 'article_inbound.body verify - inbound' )

    ticket = Ticket.find(ticket.id)
    assert_equal( ticket.article_count, 1, 'ticket.article_count verify - inbound' )
    assert_equal( ticket.last_contact.to_s, article_inbound.created_at.to_s, 'ticket.last_contact verify - inbound' )
    assert_equal( ticket.last_contact_customer.to_s, article_inbound.created_at.to_s, 'ticket.last_contact_customer verify - inbound' )
    assert_equal( ticket.last_contact_agent, nil, 'ticket.last_contact_agent verify - inbound' )
    assert_equal( ticket.first_response, nil, 'ticket.first_response verify - inbound' )
    assert_equal( ticket.close_time, nil, 'ticket.close_time verify - inbound' )

    # create note article
    article_note = Ticket::Article.create(
      ticket_id: ticket.id,
      from: 'some person',
      subject: "some\nnote",
      body: "some\n message",
      internal: true,
      sender: Ticket::Article::Sender.where(name: 'Agent').first,
      type: Ticket::Article::Type.where(name: 'note').first,
      updated_by_id: 1,
      created_by_id: 1,
    )
    assert_equal( article_note.subject, 'some note', 'article_note.subject verify - inbound' )
    assert_equal( article_note.body, "some\n message", 'article_note.body verify - inbound' )

    ticket = Ticket.find(ticket.id)
    assert_equal( ticket.article_count, 2, 'ticket.article_count verify - note' )
    assert_equal( ticket.last_contact.to_s, article_inbound.created_at.to_s, 'ticket.last_contact verify - note' )
    assert_equal( ticket.last_contact_customer.to_s, article_inbound.created_at.to_s, 'ticket.last_contact_customer verify - note' )
    assert_equal( ticket.last_contact_agent, nil, 'ticket.last_contact_agent verify - note' )
    assert_equal( ticket.first_response, nil, 'ticket.first_response verify - note' )
    assert_equal( ticket.close_time, nil, 'ticket.close_time verify - note' )

    # create outbound article
    sleep 10
    article_outbound = Ticket::Article.create(
      ticket_id: ticket.id,
      from: 'some_recipient@example.com',
      to: 'some_sender@example.com',
      subject: 'some subject',
      message_id: 'some@id2',
      body: 'some message 2',
      internal: false,
      sender: Ticket::Article::Sender.where(name: 'Agent').first,
      type: Ticket::Article::Type.where(name: 'email').first,
      updated_by_id: 1,
      created_by_id: 1,
    )

    ticket = Ticket.find(ticket.id)
    assert_equal( ticket.article_count, 3, 'ticket.article_count verify - outbound' )
    assert_equal( ticket.last_contact.to_s, article_outbound.created_at.to_s, 'ticket.last_contact verify - outbound' )
    assert_equal( ticket.last_contact_customer.to_s, article_inbound.created_at.to_s, 'ticket.last_contact_customer verify - outbound' )
    assert_equal( ticket.last_contact_agent.to_s, article_outbound.created_at.to_s, 'ticket.last_contact_agent verify - outbound' )
    assert_equal( ticket.first_response.to_s, article_outbound.created_at.to_s, 'ticket.first_response verify - outbound' )
    assert_equal( ticket.close_time, nil, 'ticket.close_time verify - outbound' )

    ticket.state_id = Ticket::State.where(name: 'closed').first.id
    ticket.save

    ticket = Ticket.find(ticket.id)
    assert_equal( ticket.article_count, 3, 'ticket.article_count verify - state update' )
    assert_equal( ticket.last_contact.to_s, article_outbound.created_at.to_s, 'ticket.last_contact verify - state update' )
    assert_equal( ticket.last_contact_customer.to_s, article_inbound.created_at.to_s, 'ticket.last_contact_customer verify - state update' )
    assert_equal( ticket.last_contact_agent.to_s, article_outbound.created_at.to_s, 'ticket.last_contact_agent verify - state update' )
    assert_equal( ticket.first_response.to_s, article_outbound.created_at.to_s, 'ticket.first_response verify - state update' )
    assert( ticket.close_time, 'ticket.close_time verify - state update' )

    # set pending time
    ticket.state_id     = Ticket::State.where(name: 'pending reminder').first.id
    ticket.pending_time = Time.zone.parse('1977-10-27 22:00:00 +0000')
    ticket.save

    ticket = Ticket.find(ticket.id)
    assert_equal( ticket.state.name, 'pending reminder', 'state verify' )
    assert_equal( ticket.pending_time, Time.zone.parse('1977-10-27 22:00:00 +0000'), 'pending_time verify' )

    # reset pending state, should also reset pending time
    ticket.state_id = Ticket::State.where(name: 'closed').first.id
    ticket.save

    ticket = Ticket.find(ticket.id)
    assert_equal( ticket.state.name, 'closed', 'state verify' )
    assert_equal( ticket.pending_time, nil )

    delete = ticket.destroy
    assert( delete, 'ticket destroy' )
  end

  test 'ticket latest change' do
    ticket1 = Ticket.create(
      title: 'latest change 1',
      group: Group.lookup( name: 'Users'),
      customer_id: 2,
      state: Ticket::State.lookup( name: 'new' ),
      priority: Ticket::Priority.lookup( name: '2 normal' ),
      updated_by_id: 1,
      created_by_id: 1,
    )
    assert_equal( Ticket.latest_change.to_s, ticket1.updated_at.to_s )

    sleep 1

    ticket2 = Ticket.create(
      title: 'latest change 2',
      group: Group.lookup( name: 'Users'),
      customer_id: 2,
      state: Ticket::State.lookup( name: 'new' ),
      priority: Ticket::Priority.lookup( name: '2 normal' ),
      updated_by_id: 1,
      created_by_id: 1,
    )
    assert_equal( Ticket.latest_change.to_s, ticket2.updated_at.to_s )

    sleep 1

    ticket1.title = 'latest change 1 - 1'
    ticket1.save
    assert_equal( Ticket.latest_change.to_s, ticket1.updated_at.to_s )

    sleep 1

    ticket1.touch
    assert_equal( Ticket.latest_change.to_s, ticket1.updated_at.to_s )

    ticket1.destroy
    assert_equal( Ticket.latest_change.to_s, ticket2.updated_at.to_s )

  end

  test 'ticket process_pending' do

    ticket = Ticket.create(
      title: 'pending close test',
      group: Group.lookup( name: 'Users'),
      customer_id: 2,
      state: Ticket::State.lookup( name: 'pending close' ),
      pending_time: Time.zone.now - 60,
      priority: Ticket::Priority.lookup( name: '2 normal' ),
      updated_by_id: 1,
      created_by_id: 1,
    )

    lookup_ticket = Ticket.find_by( 'pending_time <= ?', Time.zone.now )

    assert_equal( lookup_ticket.id, ticket.id, 'ticket.pending_time verify' )

    Ticket.process_pending

    lookup_ticket = Ticket.find_by( 'pending_time <= ?', Time.zone.now )

    assert_nil( lookup_ticket, 'ticket.pending_time processed verify' )
  end
end
