package Distribution::DB::Item::DistributionService;
use strict;
use lib '/app/tools/common/lib';
use Common::DB::Item;
use Common::DB::ItemCollection;
use Common::Assert;

use base 'Common::DB::Item';

use constant kTable => 'distribution_service';
use constant kDB    => Common::DB::Item::kCommonDB;

sub GetAll {
    my $class = shift;
    return $class->GetAllClientServices( Common::RSApp::GetClientID() );
}

sub GetAllClientServices {
    my $class     = shift;
    my $client_id = shift;
    my %args      = @_;

    assert($client_id);

    my $dbo = Common::RSApp::GetClientDB();

    my $status;
    my $services;

    if ( $args{status} && !ref( $args{status} ) ) {
        $status = $dbo->DBQuote( $args{status} );
    } elsif ( $args{status} ) {
        my @stat;
        foreach my $s ( @{ $args{status} } ) {
            push( @stat, $dbo->DBQuote($s) );
            $status = join( ',', @stat );
        }
    }

    if ( $args{service_id} && !ref( $args{service_id} ) ) {
        $services = $dbo->DBQuote( $args{service_id} );
    } elsif ( $args{service_id} ) {
        my @ser;
        foreach my $s ( @{ $args{service_id} } ) {
            push( @ser, $dbo->DBQuote($s) );
            $services = join( ',', @ser );
        }
    }

    assert($client_id);

    my $sql =
        'SELECT distribution_service.*, if( subq.service_id, 1, NULL ) as configured, account_type '
      . 'FROM distribution_service LEFT JOIN ( '
      . 'SELECT * '
      . 'FROM client_service_account_map '
      . 'INNER JOIN service_account USING (service_account_id) '
      . 'WHERE client_id = '
      . $dbo->DBQuote($client_id)
      . ') as subq USING (service_id)';

    if ( $status || $services ) {
        $sql .= " WHERE ";

        $sql .= " distribution_service.status in ($status) " if ($status);

        $sql .= " AND " if ( $status && $services );

        $sql .= " distribution_service.service_id in ($services) " if ($services);
    }

    $sql = "SELECT * FROM ( $sql ) as subq ORDER BY configured DESC, service_name";

    Common::Log::Debug("QUERY: $sql");
    return $class->SUPER::GetAll($sql);
}

sub GetServiceNames {
    my $class = shift;
    my @ids   = @_;
    my $dbo   = Common::RSApp::GetCommonDB();

    return undef unless (@ids);

    my $sql = "SELECT GROUP_CONCAT( service_name ) FROM " . kTable . " " . "WHERE service_id IN ( " . join( ",", @ids ) . " )";

    my $sth = $dbo->DoCmd($sql);
    my ($services) = $sth->fetchrow_array();

    return $services;
}

1;
