# frozen_string_literal: true
require 'fox16'
include Fox
require_relative '../database/controller'
class TabStudent<FXHorizontalFrame

  def initialize(p, *args, &blk)
    super
    @students_on_page=5
    @current_page=1
    @count_student=0
    @controller = StudentListController.new(self)
    first_tab
  end

  def update_count_students(count_students)
    @count_student = count_students
    update_page_label
  end

  def self.update_data_table(table_self, new_table)
    row_number=0
    (0...table_self.getNumRows).each do |row|
      (0...table_self.getNumColumns).each do |col|
        table_self.setItemText(row, col, "")
      end
    end
    new_table.each do |row|
      (1..3).each { |index_field| table_self.setItemText(row_number, index_field-1, row[index_field].to_s)  }
      row_number+=1
    end
  end

  def on_datalist_changed(table)
    TabStudent.update_data_table(@table, table)
  end
  def refresh
    @controller.refresh_data(@current_page, @students_on_page)
  end

  def first_tab
    add_filters
    add_table
  end

  def add_filters
    #filter
    frame_filter = FXVerticalFrame.new(self, :padTop=>50)
    frame_filter.resize(500,300)

    field_filter =[[:git, 'Гит'], [:mail, 'Почта'], [:phone_number, 'Телефон'], [:telegram, 'Телеграм']]

    #ФИЛЬТР ИМЕНИ
    nameLabel = FXLabel.new(frame_filter, "Фамилия и инициалы")
    name_text_field = FXTextField.new(frame_filter, 40)
    @filter = {short_name: name_text_field}

    #фильтрация для остальных полей
    field_filter.each do |field|
      @filter[field[0]] = create_radio_group(field, frame_filter)
    end

    #кнопка очистить
    btn_clear = FXButton.new(frame_filter, "Очистить", :opts=>BUTTON_NORMAL)
  end

  def add_table
    table_frame = FXVerticalFrame.new(self, :padLeft=>20)
    page_change_buttons(table_frame)
    # Создаем таблицу
    @table = FXTable.new(table_frame, :opts =>  TABLE_READONLY|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|TABLE_COL_SIZABLE|TABLE_ROW_RENUMBER, :width=>580, :height=>320)
    @table.setTableSize(@students_on_page, 3)

    @table.setColumnText(0, "ФИО")
    @table.setColumnText(1, "Git")
    @table.setColumnText(2, "Контакт")

    # Масштабируем таблицу
    @table.setRowHeaderWidth(30)
    @table.setColumnWidth(0, 150)
    @table.setColumnWidth(1, 150)
    @table.setColumnWidth(2, 200)

    @table.getColumnHeader.connect(SEL_COMMAND) do |a, b,col|
      sort_table_by_column(@table,col)
    end

    add_crud(table_frame)
  end


  #добавление кнопок добавить, изменить, обновить, удалить
  def add_crud(parent)
    #добавление кнопок
    btn_list = FXHorizontalFrame.new(parent)
    btn_add = FXButton.new(btn_list, "Добавить", :opts=>BUTTON_NORMAL)
    btn_update = FXButton.new(btn_list, "Обновить", :opts=>BUTTON_NORMAL)
    combo_change = FXComboBox.new(btn_list, 20, :opts=>  FRAME_SUNKEN|FRAME_THICK|LAYOUT_SIDE_TOP|LAYOUT_FILL_X)
    # btn_change = FXButton.new(btn_list, "Изменить", :opts=>BUTTON_NORMAL)
    btn_delete = FXButton.new(btn_list, "Удалить", :opts=>BUTTON_NORMAL)

    combo_change.disable
    btn_delete.disable

    combo_change.appendItem("Изменить ФИО")
    combo_change.appendItem("Изменить Git")
    combo_change.appendItem("Изменить контакт")


    # Устанавливаем обработчик события SEL_CHANGED для таблицы
    @table.connect(SEL_CHANGED) do
      num_selected_rows = 0
      (0...@table.getNumRows()).each { |row_index| num_selected_rows+=1 if @table.rowSelected?(row_index)}

      # Если выделена только одна строка, кнопка должна быть неактивной
      if num_selected_rows == 1
        combo_change.enable
        btn_delete.enable
        # Если выделено несколько строк, кнопка должна быть активной
      elsif num_selected_rows >1
        combo_change.disable
        btn_delete.enable
      end
    end

    @table.getRowHeader.connect(SEL_RIGHTBUTTONPRESS) do
      @table.killSelection(true)
      combo_change.disable
      btn_delete.disable
    end

    btn_add.connect(SEL_COMMAND) do
      @controller.student_add
    end

    btn_update.connect(SEL_COMMAND) do
      refresh
    end

    combo_change.connect(SEL_COMMAND) do
      index = (0...@table.getNumRows).find {|row_index| @table.rowSelected?(row_index)}
      case combo_change.currentItem
      when 0
        @controller.student_change_name(index)
      when 1
        @controller.student_change_git(index)
      when 2
        @controller.student_change_contact(index)
      end
    end

    btn_delete.connect(SEL_COMMAND) do
      indexes = (0...@table.getNumRows).select{|row_index| @table.rowSelected?(row_index)}
      @controller.student_delete(indexes)
    end
  end

  #отображение страниц
  def page_change_buttons(parent)
    change_page = FXHorizontalFrame.new(parent, :opts=> LAYOUT_CENTER_X)
    btn_back=FXButton.new(change_page, "Назад", :opts=> BUTTON_INITIAL)
    btn_back.textColor = Fox.FXRGB(0,23,175)
    #добавить отображение со страницы, на которой мы сейчас
    @page_label = FXLabel.new(change_page, '1')
    btn_next=FXButton.new(change_page, "Далее", :opts=> BUTTON_INITIAL)
    btn_next.textColor = Fox.FXRGB(0,23,175)

    btn_back.connect(SEL_COMMAND) do
      if @current_page!=1
        @current_page-=1
        refresh
        update_page_label
      end
    end
    btn_next.connect(SEL_COMMAND) do
      if @current_page<(@count_student / @students_on_page.to_f).ceil
        @current_page+=1
        refresh
        update_page_label
      end
    end
  end

  def sort_table_by_column(table, column_index)
    table_data = []
    (0...table.getNumRows()).each do |row_index|
      if table.getItemText(row_index, column_index)!=''
        row=[]
        (0...table.getNumColumns()).each do |col_index|
          row[col_index] = table.getItemText(row_index, col_index)
        end
        table_data<<row
      end
    end
    sorted_table_data = table_data.sort_by { |row_data| row_data[column_index] }
    sorted_table_data.each_with_index do |row_data, row_index|
      row_data.each_with_index do |cell_data, col_index|
        table.setItemText(row_index, col_index, cell_data)
      end
    end
  end
  def create_radio_group(field, parent)
    #Фильтрация гита
    frame_field = FXVerticalFrame.new(parent, LAYOUT_FILL_X||LAYOUT_SIDE_TOP)
    label_field = FXLabel.new(frame_field, field[1])
    line_radio = FXHorizontalFrame.new(frame_field, LAYOUT_FILL_X|LAYOUT_SIDE_TOP)
    # Создаем radiobutton
    radio_yes = FXRadioButton.new(line_radio, "Да")
    radio_no = FXRadioButton.new(line_radio, "Нет")
    radio_no_matter = FXRadioButton.new(line_radio, "Не важно")
    #фильтр
    text_field = FXTextField.new(line_radio, 40)
    #прописываем доступность
    text_field.setEnabled(false)
    radio_yes.connect(SEL_COMMAND) do
      radio_no.check=false
      radio_no_matter.check=false
      if radio_yes.checked?
        text_field.setEnabled(true)
      end
    end
    radio_no.connect(SEL_COMMAND) do
      radio_no_matter.check=false
      radio_yes.check=false
      if radio_no.checked?
        text_field.setEnabled(false)
      end
    end
    radio_no_matter.connect(SEL_COMMAND) do
      radio_no.check=false
      radio_yes.check=false
      if radio_no_matter.checked?
        text_field.setEnabled(false)
      end
    end
    frame_field
  end
  def update_page_label
    @page_label.text = "#{@current_page} / #{(@count_student / @students_on_page.to_f).ceil}"
  end
end