# frozen_string_literal: true

# License: AGPL-3.0-or-later WITH WTO-AP-3.0-or-later
# Full license explanation at https://github.com/houdiniproject/houdini/blob/master/LICENSE
require 'rails_helper'

RSpec.describe TicketToLegacyTicket, type: :model do
  include_context :shared_donation_charge_context

  let(:legacy_free_tickets) do
    force_create(:ticket, 
      event: event, 
      supporter: supporter, 
      ticket_level:free_ticket_level, 
      quantity: 4)
  end

  let(:legacy_nonfree_tickets) do
    force_create(:ticket, 
      event: event, 
      supporter: supporter, 
      ticket_level:ticket_level, 
      quantity: 3)
  end


  describe 'full-priced tickets' do 
    let(:trx) { force_create(:transaction, supporter: supporter, amount: 1200)}

    let(:ticket_purchase) { force_create(:ticket_purchase, trx: trx, event: event)}
    
    let(:tickets_for_ticket_purchase) do 
      legacy_free_tickets.quantity.times do |i|
        ticket_purchase.ticket_to_legacy_tickets.create(ticket: legacy_free_tickets, amount: legacy_free_tickets.ticket_level.amount)
        
      end
      legacy_nonfree_tickets.quantity.times do |i|
        ticket_purchase.ticket_to_legacy_tickets.create(ticket: legacy_nonfree_tickets, amount: legacy_nonfree_tickets.ticket_level.amount)
      end
    end

    let(:ticket_default) do 
      {
        'id' => match_houid('tkt'),
        'checked_in' => false,
        'deleted' => false,
        'note' => nil,
        'object' => 'ticket',
        'nonprofit' => nonprofit.id,
        'event' => event.id,
        'supporter' => supporter.id,
        'ticket_purchase' => ticket_purchase.id,
        'original_discount' => { 'percent' => 0},
        'event_discount' => nil
      }
    end

    let(:free_ticket_default) {
      ticket_default.merge({
        'ticket_level' => legacy_free_tickets.ticket_level.id,
        'amount' => {'currency' => 'usd', 'value_in_cents' => 0}
      })
    }

    let(:nonfree_ticket_default) {
      ticket_default.merge({
        'ticket_level' =>  legacy_nonfree_tickets.ticket_level.id,
        'amount' => {'currency' => 'usd', 'value_in_cents' => legacy_nonfree_tickets.ticket_level.amount}
      })
    }

    subject { tickets_for_ticket_purchase; TicketToLegacyTicket}

    it 'has 7 TicketToLegacyTicket' do
      expect(subject.count).to eq 7
    end

    it 'has 3 pointing at legacy_free_tickets' do
      expect(subject.where(ticket: legacy_free_tickets).count).to eq 4
    end

    it 'has 4 pointing at legacy_nonfree_tickets' do
      expect(subject.where(ticket: legacy_nonfree_tickets).count).to eq 3
    end

    it 'has a valid free_ticket' do 
      expect(subject.where(ticket: legacy_free_tickets).first.to_builder.attributes!).to match(free_ticket_default)
    end

    it 'has a valid nonfree  ticket' do 
      expect(subject.where(ticket: legacy_nonfree_tickets).first.to_builder.attributes!).to match(nonfree_ticket_default)
    end

    it 'has all free checked in' do 
      legacy_free_tickets.checked_in = true
      legacy_free_tickets.note = "NOTE"
      legacy_free_tickets.deleted = true
      legacy_free_tickets.save!

      
      subject.where(ticket: legacy_free_tickets).each do |item|
        json = item.to_builder.attributes!
        expect(json).to match(free_ticket_default.merge({
          'deleted' => true,
          'checked_in' => true,
          'note' => "NOTE"
        }))
      end
    end
  end

  describe 'discounted tickets' do 
    let(:trx) { force_create(:transaction, supporter: supporter, amount: 960) }

    let(:ticket_purchase) { force_create(:ticket_purchase, trx: trx, event: event, event_discount: event_discount, original_discount: 20) }

    let(:tickets_for_ticket_purchase) do 
      legacy_free_tickets.quantity.times do |i|
        ticket_purchase.ticket_to_legacy_tickets.create(ticket: legacy_free_tickets, amount: 0)
        
      end
      legacy_nonfree_tickets.quantity.times do |i|
        ticket_purchase.ticket_to_legacy_tickets.create(ticket: legacy_nonfree_tickets, amount: 320)
      end
    end

    let(:ticket_default) do 
      {
        'id' => match_houid('tkt'),
        'checked_in' => false,
        'deleted' => false,
        'note' => nil,
        'object' => 'ticket',
        'nonprofit' => nonprofit.id,
        'event' => event.id,
        'supporter' => supporter.id,
        'ticket_purchase' => ticket_purchase.id,
        'original_discount' => { 'percent' => 20},
        'event_discount' => event_discount.id
      }
    end

    let(:free_ticket_default) {
      ticket_default.merge({
        'ticket_level' => legacy_free_tickets.ticket_level.id,
        'amount' => {'currency' => 'usd', 'value_in_cents' => 0}
      })
    }

    let(:nonfree_ticket_default) {
      ticket_default.merge({
        'ticket_level' =>  legacy_nonfree_tickets.ticket_level.id,
        'amount' => {'currency' => 'usd', 'value_in_cents' => 320 }
      })
    }

    subject { tickets_for_ticket_purchase; TicketToLegacyTicket}

    it 'has 7 TicketToLegacyTicket' do 
      expect(subject.count).to eq 7
    end

    it 'has 3 pointing at legacy_free_tickets' do
      expect(subject.where(ticket: legacy_free_tickets).count).to eq 4
    end

    it 'has 4 pointing at legacy_nonfree_tickets' do
      expect(subject.where(ticket: legacy_nonfree_tickets).count).to eq 3
    end


    it 'has a valid free_ticket' do 
      expect(subject.where(ticket: legacy_free_tickets).first.to_builder.attributes!).to match(free_ticket_default)
    end

    it 'has a valid nonfree  ticket' do 
      expect(subject.where(ticket: legacy_nonfree_tickets).first.to_builder.attributes!).to match(nonfree_ticket_default)
    end

    it 'has all free checked in' do 
      legacy_free_tickets.checked_in = true
      legacy_free_tickets.note = "NOTE"
      legacy_free_tickets.deleted = true
      legacy_free_tickets.save!

      
      subject.where(ticket: legacy_free_tickets).each do |item|
        json = item.to_builder.attributes!
        expect(json).to match(free_ticket_default.merge({
          'deleted' => true,
          'checked_in' => true,
          'note' => "NOTE"
        }))
      end
    end
  end
  
end