class TechnologyPaymentService
  attr_reader :school, :school_year

  def initialize(school, school_year = nil)
    @school = school
    @school_year = school_year || school.current_year
  end

  def current_payments
    TechnologyPayment.joins("LEFT JOIN Families f ON AccTechnologyPayment.FamilyID = f.FamilyID")
      .joins("LEFT JOIN Students s ON AccTechnologyPayment.StudentID = s.StudentID")
      .select("DATE_FORMAT(AccTechnologyPayment.CreatedAt, '%m/%d/%y') as tdate, 
          AccTechnologyPayment.Amount, 
          AccTechnologyPayment.FamilyID, 
          AccTechnologyPayment.StudentID,
          f.Name as FamilyName, 
          s.FirstName, 
          s.LastName")
      .where(SchoolID: school.id, SchoolYearID: school_year.id)
      .order("AccTechnologyPayment.CreatedAt DESC")
  end

  def outstanding_students
    SchoolYearStudent.joins("JOIN Students s ON s.StudentID = SchoolYearStudents.StudentID")
      .joins("LEFT JOIN Families f ON s.FamilyID = f.FamilyID")
      .joins("LEFT JOIN AccTechnologyPayment atp ON atp.StudentID = s.StudentID AND atp.SchoolYearID = #{school_year.id}")
      .select("s.StudentID, s.FirstName, s.LastName, s.MiddleName, s.Grade, s.StudentCode, f.Name as FamilyName")
      .where(SchoolYearID: school_year.id, Current: 1)
      .where("s.Deleted = 0")
      .where(atp: { StudentID: nil })
  end

  def export_csv
    require 'csv'
    
    CSV.generate(headers: true) do |csv|
      csv << ['Date', 'Student', 'Family', 'Amount']
      
      # Add current payments
      current_payments.each do |payment|
        student_name = build_student_name(payment.LastName, payment.FirstName)
        family_name = payment.FamilyName || 'N/A'
        date = payment.tdate || 'Outstanding'
        amount = payment.Amount || TechnologyPayment.default_amount
        
        csv << [date, student_name, family_name, amount]
      end
      
      # Add outstanding payments
      outstanding_students.each do |student|
        student_name = build_student_name(student.LastName, student.FirstName)
        family_name = student.FamilyName || 'N/A'
        amount = TechnologyPayment.default_amount
        
        csv << ['Outstanding', student_name, family_name, amount]
      end
    end
  end

  private

  def build_student_name(last_name, first_name)
    student_name = "#{last_name}, #{first_name}".strip
    student_name == ", " ? "N/A" : student_name
  end
end
