package Weather::Com::Wind;

use 5.006;
use strict;
use warnings;
use Weather::Com::L10N;
use Weather::Com::Base qw/convert_winddirection/;
use base 'Weather::Com::Object';

our $VERSION = sprintf "%d.%03d", q$Revision: 1.2 $ =~ /(\d+)/g;

#------------------------------------------------------------------------
# Constructor
#------------------------------------------------------------------------
sub new {
	my $proto = shift;
	my $class = ref($proto) || $proto;
	my %parameters;

	# parameters provided by new method
	if ( ref( $_[0] ) eq "HASH" ) {
		%parameters = %{ $_[0] };
	} else {
		%parameters = @_;
	}

	my $self = $class->SUPER::new( \%parameters );

	# getting first weather information
	$self->{SPEED}       = -1;
	$self->{GUST}        = -1;
	$self->{DIR_DEGREES} = -1;
	$self->{DIR_TXT}     = 'N/A';
	return $self;
}    # end new()

#------------------------------------------------------------------------
# update wind data
#------------------------------------------------------------------------
sub update {
	my $self = shift;
	my %wind;

	if ( ref( $_[0] ) eq "HASH" ) {
		%wind = %{ $_[0] };
	} else {
		%wind = @_;
	}

	# handle non existent wind data
	unless ( $wind{s} ) {
		$self->{SPEED}       = -1;
		$self->{GUST}        = -1;
		$self->{DIR_DEGREES} = -1;
		$self->{DIR_TXT}     = 'N/A';
	} elsif ( lc( $wind{s} ) eq "calm" ) {

		# special rules apply if speed is non-numeric
		$self->{SPEED}       = 0;
		$self->{GUST}        = 0;
		$self->{DIR_DEGREES} = -1;
		$self->{DIR_TXT}     = 'N/A';
	} else {

		# else update object data
		$self->{SPEED}       = $wind{s};
		$self->{GUST}        = $wind{gust};
		$self->{DIR_DEGREES} = $wind{d};
		$self->{DIR_TXT}     = $wind{t};
	}

}

#------------------------------------------------------------------------
# accessor methods
#------------------------------------------------------------------------
sub speed {
	my $self = shift;
	return $self->{SPEED};
}

sub maximum_gust {
	my $self = shift;
	return $self->{GUST};
}

sub direction_degrees {
	my $self = shift;
	return $self->{DIR_DEGREES};
}

sub direction_short {
	my $self     = shift;
	my $language = shift;

	return $self->get_language_handle($language)->maketext( $self->{DIR_TXT} );
}

sub direction_long {
	my $self     = shift;
	my $language = shift;

	my $dir = convert_winddirection( $self->{DIR_TXT} );
	return $self->get_language_handle($language)->maketext($dir);
}

1;

__END__

=pod

=head1 NAME

Weather::Com::Wind - class containing wind data

=head1 SYNOPSIS

  #!/usr/bin/perl -w
  use Weather::Com::Finder;

  # you have to fill in your ids from weather.com here
  my $PartnerId  = 'somepartnerid';
  my $LicenseKey = 'mylicense';

  my %weatherargs = (
	'partner_id' => $PartnerId,
	'license'    => $LicenseKey,
	'language'   => 'de',
  );

  my $weather_finder = Weather::Com::Finder->new(%weatherargs);
  
  my @locations = $weather_finder->find('Heidelberg');

  my $currconditions = $locations[0]->current_conditions();

  print "Wind comes from ", $currconditions->wind()->direction_long(), "\n";
  print "and its speed is", $currconditions->wind()->speed(), "\n";  

=head1 DESCRIPTION

Via I<Weather::Com::Wind> one can access speed and direction (in degrees,
short and long textual description) of the wind. Wind is usually an object
belonging to current conditions or to a forecast (not implemented yet).

This class will B<not> be updated automatically with each call to one
of its methods. You need to call the C<wind()> method of the parent
object again to update your object.

=head1 CONSTRUCTOR

You usually would not construct an object of this class yourself. 
This is implicitely done when you call the C<wind()> method of one
current conditions or forecast object.

=head1 METHODS

=head2 speed()

Returns the wind speed.

=head2 direction_degrees()

Returns the direction of the wind in degrees.

=head2 direction_short([$language])

Returns the direction of the wind as wind mnemonic (N, NW, E, etc.).

These directions are being translated if you specified a language in the
parameters you provided to your I<Weather::Com::Finder>.

This attribute is I<dynamic language enabled>.

=head2 direction_long([$language])

Returns the direction of the wind as long textual description
(North, East, Southwest, etc.).

These directions are being translated if you specified a language in the
parameters you provided to your I<Weather::Com::Finder>.

This attribute is I<dynamic language enabled>.

=head1 AUTHOR

Thomas Schnuecker, E<lt>thomas@schnuecker.deE<gt>

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2004-2009 by Thomas Schnuecker

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

The data provided by I<weather.com> and made accessible by this OO
interface can be used for free under special terms. 
Please have a look at the application programming guide of
I<weather.com> (L<http://www.weather.com/services/xmloap.html>)!

=cut