package Reddit::Client::Comment;

use strict;
use warnings;
use Carp;

require Reddit::Client::VotableThing;
# comments don't have over_18 and is_self, do they?
use base   qw/Reddit::Client::VotableThing/;
use fields qw/ 
approved_by
author
author_flair_css_class
author_flair_text
banned_by
body
body_html
can_mod_post
clicked
created
created_utc
domain
hidden
is_self
link_author
link_id
link_permalink
link_title
link_url
locked
media_embed
mod_reports
more
num_comments
num_reports
over_18
parent_id
permalink
quarantine
removed
replies
saved
selftext
selftext_html
spam
stickied
subreddit
subreddit_id
thumbnail
title
user_reports
/;

use constant type => "t1";
# This is called by the magic in Thing.pm on creation
sub set_replies { 
    my ($self, $value) = @_;
    if (ref $value && exists $value->{data}{children}) {
		my $comments = $value->{data}{children};
		my $return = [];

		for my $cmt (@$comments) {
			# 'kind' is on same level as 'data'
			if ($cmt->{kind} eq 't1') {
				push @$return, Reddit::Client::Comment->new($self->{session}, $cmt->{data});
			} elsif ($cmt->{kind} eq 'more') {
				my $more = Reddit::Client::MoreComments->new($self->{session}, $cmt->{data});
				$more->{link_id} = $self->{link_id};
				$self->{more} = $more->{children};
				push @$return, $more;
			}
		}
		
		$self->{replies} = $return;
    } else {
        $self->{replies} = [];
    }
}
# need fix this
sub get_collapsed_comments {
	my ($self, %param) = @_;
	return undef if !$self->{more} or ref $self->{more} ne 'ARRAY';
	
	my %data = (
		link_id		=> $self->{link_id},
		children	=> $self->{more},
	);
	$data{sort}	= $param{sort} if $param{sort};
	$data{id}	= $param{id} if $param{id};

	return $self->{session}->get_collapsed_comments( %data );
}

sub reply {
    	my ($self, $text) = @_;
	$text || croak "need comment text";	
	my $cmtid = $self->{session}->submit_comment(parent_id=>$self->{name}, text=>$text);
	return "t1_".$cmtid if $cmtid;
	return $cmtid;
}
sub remove {
	my $self = shift;
	return $self->{session}->remove($self->{name});
}
sub spam {
	my $self = shift;
	return $self->{session}->spam($self->{name});
}
sub edit {
    	my ($self, $text) = @_;
	my $cmtid = $self->{session}->edit($self->{name}, $text);
	$self->{body} = $text if $cmtid;
	return $cmtid;
}
sub delete {
    	my $self = shift;
	my $cmtid = $self->{session}->delete($self->{name});
	return $cmtid;
}
sub get_permalink { 	# deprecated. Duplicated instead of calling get_web_url
	my $self = shift;	# because this may (and probably will) change someday
	return $self->{session}->get_origin().$self->{permalink}
}
sub get_web_url {
	my $self = shift;
	return $self->{session}->get_origin().$self->{permalink}
}
sub get_children {
	my $self = shift;
	my $cmts = $self->{session}->get_comments(permalink=>$self->{permalink});
	$self->{replies} = $$cmts[0]->{replies}; # populate this comment's replies
	return $$cmts[0]->{replies}; 
}
sub get_comments {
	my $self = shift;
	my $cmts = $self->{session}->get_comments(permalink=>$self->{permalink});
	$self->{replies} = $$cmts[0]->{replies}; # populate this comment's replies
	return $cmts;
}

sub has_collapsed_children {
	my $self = shift;
	return $self->{more} ? 1 : 0;
}

sub replies {
    return shift->{replies};
}
1;

__END__

=pod

=head1 NAME

Reddit::Client::Comment

=head1 DESCRIPTION

Wraps a posted comment.

=head1 SUBROUTINES/METHODS

=over

=item replies()

Returns a list ref of replies underneath this comment.

=item reply(...)

Syntactic sugar for C<Reddit::Client::submit_comment()>.

=back

=head1 INTERNAL ROUTINES

=over

=item set_replies

Wraps the list of children in Comment class instances and ensures that comments
with no replies return an empty array for C<replies>.

=back

=head1 AUTHOR

<mailto:earthtone.rc@gmail.com>

=head1 LICENSE

BSD license

=cut