require_relative 'person'

class Student < Person
    attr_accessor :surname, :name, :patronymic
  
    def initialize(args = {})
      super(args)
      @surname = args.fetch(:surname)
      raise ArgumentError, "Invalid surname format: #{@surname}" unless self.class.valid_name?(@surname)
  
      @name = args.fetch(:name)
      raise ArgumentError, "Invalid name format: #{@name}" unless self.class.valid_name?(@name)
  
      @patronymic = args.fetch(:patronymic)
      raise ArgumentError, "Invalid patronymic format: #{@patronymic}" unless self.class.valid_name?(@patronymic)
  
      set_contacts(
        phone: args[:phone],
        telegram: args[:telegram],
        email: args[:email]
      )
    end
  
    def self.from_string(student_string)
      parts = student_string.split('|').map(&:strip)
      surname, name, patronymic = parts[0].split(' ')
      id = parts[1].split(': ').last.to_i
      phone = parts[2].split(': ').last
      telegram = parts[3].split(': ').last
      email = parts[4].split(': ').last
      git = parts[5].split(': ').last
  
      new(
        surname: surname,
        name: name,
        patronymic: patronymic,
        id: id,
        phone: phone,
        telegram: telegram,
        email: email,
        git: git
      )
    end

    def self.read_from_txt(file_path)
        raise IOError, "File path is invalid or file does not exist: #{file_path}" unless File.exist?(file_path)
    
        students = []
    
        File.foreach(file_path) do |line|
          line.strip!
          next if line.empty?
    
          begin
            student = from_string(line)
            students << student
          rescue ArgumentError => e
            puts "Error processing line: '#{line}'. Reason: #{e.message}"
          end
        end
    
        students
    end

    def self.write_to_txt(file_path, students)
        raise ArgumentError, "Expected an array of Student objects" unless students.is_a?(Array) && students.all? { |s| s.is_a?(Student) }
    
        File.open(file_path, 'w') do |file|
          students.each do |student|
            file.puts student.to_s
          end
        end
    
        puts "Data successfully written to #{file_path}"
    rescue IOError => e
        puts "An error occurred while writing to the file: #{e.message}"
    end
  
    def surname_and_initials
      "#{@surname} #{name[0]}.#{patronymic[0]}."
    end
  
    def to_s
      "#{@surname} #{@name} #{@patronymic} | ID: #{@id || 'N/A'} | " \
      "Phone: #{@phone || 'N/A'} | Telegram: #{@telegram || 'N/A'} | " \
      "Email: #{@email || 'N/A'} | Git: #{@git || 'N/A'}"
    end
  
    def get_info
      "#{surname_and_initials}, Git: #{git_info}, Contact: #{contact_info}"
    end
end