package Kephra::Document;
our $VERSION = '0.53';

use strict;
use warnings;

sub _file_config { Kephra::File::_config() }
sub _new_if_allowed {
	# new(empty), add(open) restore(open session)
	my $mode = shift;
	my $ep   = Kephra::App::EditPanel::_ref();
	my $file = Kephra::Document::Data::get_file_path();
	my $old_doc_nr= Kephra::Document::Data::current_nr();
	my $new_doc_nr= Kephra::Document::Data::get_value('buffer');
	my $config    = _file_config()->{open};

	# check settings
	# in single doc mode close previous doc first
	if ( $config->{single_doc} == 1 ) {
		Kephra::File::close_current();
		return 0;
	}
	unless ( $mode eq 'new' ) {
		if ($ep->GetText eq '' and $ep->GetModify == 0 and (not $file or not -e $file)){
			return $old_doc_nr
				if ($config->{into_empty_doc} == 1)
				or ($config->{into_only_empty_doc} == 1 and $new_doc_nr == 1 );
		}
	}
	# still there? good, now we make a new document
	Kephra::Document::Data::create_slot($new_doc_nr);
	Kephra::App::TabBar::add_edit_tab($new_doc_nr);
	Kephra::App::EditPanel::apply_settings_here
		( Kephra::Document::Data::_ep($new_doc_nr) );
	Kephra::Document::Data::inc_value('buffer');
	return $new_doc_nr;
}

sub _load_file_in_buffer {
	my $file = shift;
	my $doc_nr = shift || Kephra::Document::Data::current_nr();
	my $ep = Kephra::Document::Data::_ep($doc_nr);
	return unless -r $file and Kephra::App::EditPanel::is( $ep );
	$ep->ClearAll();
	# retrieve if utf is set
	Kephra::Document::Data::set_file_path($file, $doc_nr);
	if (Kephra::File::IO::open_buffer($doc_nr) ){
		Kephra::File::_remember_save_moment($doc_nr);
		$ep->EmptyUndoBuffer;
		$ep->SetSavePoint;
		Kephra::Document::Data::inc_value('loaded');
	}
}
#
sub new   {   # make document empty and reset all document properties to default
	my $old_nr = Kephra::Document::Data::current_nr();
	my $doc_nr = _new_if_allowed('new');
	Kephra::Document::Data::set_previous_nr( $old_nr );
	Kephra::Document::Data::set_current_nr( $doc_nr );
	Kephra::App::TabBar::raise_tab_by_doc_nr($doc_nr);
	&reset($doc_nr);
	Kephra::EventTable::trigger('document.new');
}

sub reset {   # restore once opened file from its settings
	my $doc_nr = Kephra::Document::Data::validate_doc_nr(shift);
	$doc_nr = Kephra::Document::Data::current_nr() unless defined $doc_nr;
	my $ep = Kephra::Document::Data::_ep( $doc_nr );
	Kephra::Document::Property::set_readonly(0, $doc_nr);
	$ep->ClearAll;
	$ep->EmptyUndoBuffer;
	$ep->SetSavePoint;
	Kephra::Document::Data::set_attributes_to_default($doc_nr, '');
	Kephra::Document::Data::evaluate_attributes($doc_nr);
	Kephra::App::Window::refresh_title();
	Kephra::App::TabBar::refresh_label($doc_nr);
	Kephra::App::StatusBar::refresh_all_cells();
	Kephra::Edit::Marker::delete_doc($doc_nr);
	Kephra::App::EditPanel::Margin::autosize_line_number($ep, $doc_nr);
}


sub restore { # add newly opened file from known settings
	my %file_settings = %{ shift; };
	my $file = $file_settings{file_path};
	my $config = _file_config();
	if ( -e $file ) {
		# open only text files and empty files
		return if $config->{open}{only_text} == 1 and -B $file;
		# check if file is already open and goto this already opened
		return if $config->{open}{each_once} == 1 
		      and Kephra::Document::Data::file_already_open($file);
		my $doc_nr = _new_if_allowed('restore');
		$file_settings{ep_ref} = Kephra::Document::Data::_ep($doc_nr);
		Kephra::Document::Data::set_all_attributes(\%file_settings, $doc_nr);
		_load_file_in_buffer($file, $doc_nr);
		Kephra::Document::Data::set_current_nr($doc_nr);
		Kephra::Document::Data::set_file_path($file, $doc_nr);
		Kephra::Document::Data::evaluate_attributes($doc_nr);
		Kephra::App::TabBar::raise_tab_by_doc_nr($doc_nr);
		return $doc_nr;
	}
	return -1;
}


sub add {     # create a new document if settings allow it
	my $file = shift;
	my $config = _file_config();
	my $old_nr = Kephra::Document::Data::current_nr();
	if ( defined $file and -e $file ) {
		$file = Kephra::Config::standartize_path_slashes( $file );
		# open only text files and empty files
		# return if -B $file and $config->{open}{only_text} == 1;
		# check if file is already open and goto this already opened
		my $other_nr = Kephra::Document::Data::nr_from_file_path($file);
		return Kephra::Document::Change::to_nr( $other_nr )
			if $config->{open}{each_once} == 1 and $other_nr > -1;
		# save constantly changing settings
		Kephra::Document::Data::update_attributes();
		# create new edit panel
		my $doc_nr = _new_if_allowed('add') || 0;
		# return because settings didn't allow new doc
		return if $doc_nr > 0 and $doc_nr == $old_nr;
		Kephra::Document::Data::set_current_nr($doc_nr);
		Kephra::Document::Data::set_previous_nr($old_nr);
		# load default settings for doc attributes
		Kephra::Document::Data::set_attributes_to_default($doc_nr, $file);
		_load_file_in_buffer($file, $doc_nr);
		Kephra::Document::Property::convert_EOL(), Kephra::File::_save_nr($doc_nr)
			unless Kephra::Document::Data::get_attribute{'EOL',$doc_nr} eq 'auto';
		Kephra::Document::Data::evaluate_attributes($doc_nr);
		Kephra::App::Window::refresh_title();
		Kephra::App::TabBar::raise_tab_by_doc_nr($doc_nr);
		Kephra::App::EditPanel::Margin::autosize_line_number();
		Kephra::EventTable::trigger('document.new');
		Kephra::EventTable::trigger('document.list');
	}
}

# document wide coverter
sub convert_indent2tabs   { _edit( \&Kephra::Edit::Convert::indent2tabs  )}
sub convert_indent2spaces { _edit( \&Kephra::Edit::Convert::indent2spaces)}
sub convert_spaces2tabs   { _edit( \&Kephra::Edit::Convert::spaces2tabs  )}
sub convert_tabs2spaces   { _edit( \&Kephra::Edit::Convert::tabs2spaces  )}
sub del_trailing_spaces   { _edit( \&Kephra::Edit::Format::del_trailing_spaces)}

sub save_state {
}
sub restore_styte {
}
#
sub _edit {
	my $coderef = shift;
	return unless ref $coderef eq 'CODE';
	Kephra::Edit::_save_positions();
	Kephra::Edit::Select::all();
	&$coderef();
	Kephra::Edit::_restore_positions();
	1;
}

sub do_with_all {
	my $code = shift;
	return unless ref $code eq 'CODE';
	my $nr = Kephra::Document::Data::current_nr();
	my $attr = Kephra::Document::Data::_attributes();
	Kephra::Document::Data::update_attributes();
	for ( @{ Kephra::Document::Data::all_nr() } ) {
		Kephra::Document::Data::set_current_nr($_);
		&$code( $attr->[$_] );
	}
	Kephra::Document::Data::set_current_nr($nr);
	Kephra::Document::Data::evaluate_attributes($nr);
}

1;

=head1 NAME

Kephra::Document - general doc functions

=head1 DESCRIPTION



=cut