#!/usr/bin/perl

use Modern::Perl;
use Encode qw( encode );

use C4::Service;
use Koha::Localizations;

our ( $query, $response ) = C4::Service->init( parameters => 'manage_itemtypes' );

sub get_translations {
    my $rs = Koha::Localizations->search( { entity => $query->param('entity'), code => $query->param('code') } );
    my @translations;
    while ( my $s = $rs->next ) {
        push @translations, {
            id          => $s->localization_id,
            entity      => $s->entity,
            code        => $s->code,
            lang        => $s->lang,
            translation => $s->translation,
        };
    }
    $response->param( translations => \@translations );
    C4::Service->return_success($response);
}

sub update_translation {
    my $id          = $query->param('id');
    my $translation = $query->param('translation');
    my $lang        = $query->param('lang');

    my $localization = Koha::Localizations->find($id);
    if ( defined $lang and $localization->lang ne $lang ) {
        $localization->lang($lang);
    }
    if ( defined $translation and $localization->translation ne $translation ) {
        $localization->translation($translation);
    }
    my %params;
    my $is_changed;
    if ( $localization->is_changed ) {
        $is_changed = 1;
        unless (
            Koha::Localizations->search(
                {
                    entity          => $localization->entity, code => $localization->code, lang => $lang,
                    localization_id => { '!=' => $localization->localization_id },
                }
            )->count
            )
        {
            $localization->store;
        } else {
            $params{error}      = 1;
            $params{error_code} = 'already_exists';
        }
    }
    $response->param(
        %params,
        id          => $localization->localization_id,
        entity      => $localization->entity,
        code        => $localization->code,
        lang        => $localization->lang,
        translation => $localization->translation,
        is_changed  => $is_changed,
    );
    C4::Service->return_success($response);
}

sub add_translation {
    my $entity      = $query->param('entity');
    my $code        = $query->param('code');
    my $lang        = $query->param('lang');
    my $translation = $query->param('translation');

    unless ( Koha::Localizations->search( { entity => $entity, code => $code, lang => $lang, } )->count ) {
        my $localization = Koha::Localization->new(
            {
                entity      => $entity,
                code        => $code,
                lang        => $lang,
                translation => $translation,
            }
        );
        $localization->store;
        $response->param(
            id          => $localization->localization_id,
            entity      => $localization->entity,
            code        => $localization->code,
            lang        => $localization->lang,
            translation => $localization->translation,
        );

    } else {
        $response->param( error => 1, error_code => 'already_exists', );
    }
    C4::Service->return_success($response);
}

sub delete_translation {
    my $id = $query->param('id');
    Koha::Localizations->find($id)->delete;
    $response->param( id => $id );
    C4::Service->return_success($response);
}

C4::Service->dispatch(
    [ 'GET /',    ['id'],                                      \&get_translations ],
    [ 'PUT /',    ['id'],                                      \&update_translation ],
    [ 'POST /',   [ 'entity', 'code', 'lang', 'translation' ], \&add_translation ],
    [ 'DELETE /', ['id'],                                      \&delete_translation ],
);
