package Finance::Quote::Oslobors;

use strict;
use JSON qw( decode_json );
use HTTP::Request::Common;

our $VERSION = '1.52'; # VERSION

use vars qw( $OSLOBORS_COMPONENTS_URL );

$OSLOBORS_COMPONENTS_URL = "https://www.oslobors.no/ob/servlets/components?type=table&source=feed.omff.FUNDS&view=REALTIME&columns=ITEM%2C+PRICECHANGEPCT%2C+PRICE%2C+DATE%2C+QUOTATIONCURRENCY&filter=ITEM_SECTOR%3D%3Ds";

sub methods { return (oslobors => \&oslobors); }

{
  my @labels = qw/date isodate method source currency price p_change/;
  sub labels { return (oslobors => \@labels); }
}

sub oslobors {
  my $quoter = shift;
  my @symbols = @_;
  my %funds;

  my $ua = $quoter->user_agent;

  my ($url, $reply, $data);

  foreach my $symbol (@symbols) {
    $url = $OSLOBORS_COMPONENTS_URL . $symbol;
    $reply = $ua->request(GET $url);
    unless($reply->is_success) {
      $funds{$symbol, "success"} = 0;
      $funds{$symbol, "errormsg"} = "HTTP request failed";
    } else {
      $data = JSON::decode_json($reply->content)->{"rows"}[0]{"values"};

      $quoter->store_date(\%funds, $symbol, { isodate => sprintf("%s-%s-%s", $data->{"DATE"} =~ /(\d\d\d\d)(\d\d)(\d\d)/)});
      $funds{$symbol, 'method'}   = 'oslobors';
      $funds{$symbol, 'currency'} = $data->{"QUOTATIONCURRENCY"};
      $funds{$symbol, 'success' } = 1;
      $funds{$symbol, 'price'   } = $data->{"PRICE"};
      $funds{$symbol, 'source'  } = 'Finance::Quote::Oslobors';
      $funds{$symbol, 'symbol'  } = $symbol;
      $funds{$symbol, 'p_change'} = $data->{"PRICECHANGEPCT"};
    }
  }

  return wantarray() ? %funds : \%funds;
}

1;

=head1 NAME

Finance::Quote::Oslobors - Obtain fund quotes from Oslo stock exchange

=head1 SYNOPSIS

    use Finance::Quote;
    $q = Finance::Quote->new;
    %fundinfo = $q->fetch("oslobors","FUND-TICKER.OSE");

=head1 DESCRIPTION

This module obtains information about mutual fund prices from
www.oslobors.no.

=head1 FUND TICKER SYMBOLS

The fund ticker symbols can be found by searching for the fund,
and visit its page. The symbol will be visible in the URL, for
instance OD-HORIA.OSE. The .OSE part is necessary.

The package does not understand Oslo stock symbols.

=head1 LABELS RETURNED

The module returns date, method, source, currency, price and p_change.
The prices are updated on bank days.

=head1 SEE ALSO

Finance::Quote

=cut
