package Role::ReferralSource;

use Moose::Role;
use Data::Dumper;

has referral_source_practices => ( is => 'ro', isa => 'HashRef', lazy_build => 1 );

sub add_new_practices_to_referral_sources {
	my ($self, $practices) = @_; # warn Dumper $practices; 
	
    my $dbix3 = $self->db->{dbix3};
    my $dbix4 = $self->db->{dbix4};
    
    my $ref_src_practices = $self->referral_source_practices; # warn Dumper $ref_src_practices;

	PRACTICE:
	for my $practice_code (@$practices) { # warn $practice_code;
		$practice_code =~ s/\s//g; # trim blank spaces (for YHHN practices)
		
		# skip existing practices:
		next if $ref_src_practices->{$practice_code}; # warn $practice_code;

		# get details from cm.gp_practices:
		my $sql = qq!select * from community_monitoring.gp_practices where practice_id = ?!;
		my $practice = $dbix3->query($sql, $practice_code)->hash; # warn Dumper $practice;
		
		unless ($practice) {
			warn "no practice found in community_monitoring.gp_practices for $practice_code";
			next PRACTICE;
		} #	next PRACTICE;

		my $parent_organisation_id = $dbix4->query(q!select id from parent_organisations
			where parent_code = ?!, $practice_code)->array;
		
        if (! $parent_organisation_id) { # add practice to parent_organisations & retrieve new id:
            my @address = split ', ', $practice->{address};

            my $description = join ', ', uc $address[0], $practice->{post_code};

            my %data = (
                parent_code => $practice_code,
                description => $description,
                referral_type_id => 5,
            ); # warn Dumper \%data; next PRACTICE;
            $dbix4->insert('parent_organisations', \%data);
         
			$parent_organisation_id
			    = $dbix4->last_insert_id(undef, undef, 'parent_organisations', 'id')
			    || die "Cannot retrieve parent_organisation_id for $practice_code";
        }

        # warn Dumper ($practice_code, $parent_organisation_id);
        my %data = (
            organisation_code => $practice_code,
            referral_type_id  => 5, # practice
            parent_organisation_id => $parent_organisation_id,
            display_name => join ', ', @{$practice}{qw(address post_code)},
        ); # warn Dumper \%data; next PRACTICE;
        $dbix4->insert('referral_sources', \%data);
		
		# add new org_code entry to $ref_src_practices:
		{
			my $referral_sources_id
				= $dbix4->last_insert_id(undef, undef, 'referral_sources', 'id')
				|| die "Cannot retrieve referral_sources.id for $practice_code";
			$ref_src_practices->{$practice_code} = $referral_sources_id;
		}
	} 
}

sub _build_referral_source_practices {
	my $self = shift;
	
	my $sql = q!select organisation_code, id from referral_sources
		where organisation_code like 'B_____'
		or organisation_code like 'C_____'
		or organisation_code like 'P_____'
		or organisation_code like 'Y_____'!;
	
	return $self->db->{dbix4}->query($sql)->map;
}

1;