#!/usr/bin/perl

use Modern::Perl;
use Encode qw( encode );
use Try::Tiny;
use JSON qw( to_json );

use C4::Service;
use Koha::Caches;
use Koha::Database;
use C4::Output qw( output_with_http_headers );

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

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

    my $schema = Koha::Database->schema;
    my $row    = $schema->resultset($source)->find($object_id);
    if ($row) {
        my $localization = $row->localizations->find($localization_id);
        if ($localization) {
            try {
                my $original_lang = $localization->lang;
                $localization->lang($lang)               if $lang;
                $localization->translation($translation) if $translation;
                $localization->update();
                Koha::Caches->get_instance('localization')->clear_from_cache("$source:$original_lang");
                Koha::Caches->get_instance('localization')->clear_from_cache("$source:$lang") if $lang;
            } catch {
                $localization->discard_changes();
                $response->param( error => 1, error_code => 'already_exists' );
            };
        }

        $response->param(
            lang        => $localization->lang,
            translation => $localization->translation,
        );
    }

    C4::Service->return_success($response);
}

sub add_translation {
    my $source          = $query->param('source');
    my $localization_id = $query->param('localization_id');
    my $object_id       = $query->param('object_id');
    my $property        = $query->param('property');
    my $lang            = $query->param('lang');
    my $translation     = $query->param('translation');

    my $schema = Koha::Database->schema;
    my $row    = $schema->resultset($source)->find($object_id);
    try {
        my $localization = $row->create_related(
            "${property}_localizations",
            {
                entity      => $source,
                lang        => $lang,
                translation => $translation,
            }
        );
        Koha::Caches->get_instance('localization')->clear_from_cache("$source:$lang");

        $response->param(
            lang            => $localization->lang,
            translation     => $localization->translation,
            localization_id => $localization->id,
        );
    } catch {
        $response->param( error => 1, error_code => 'already_exists' );
    };

    C4::Service->return_success($response);
}

sub delete_translation {
    my $source          = $query->param('source');
    my $object_id       = $query->param('object_id');
    my $localization_id = $query->param('localization_id');

    my $schema = Koha::Database->schema;
    my $row    = $schema->resultset($source)->find($object_id);
    if ( $row && $row->can('localizations') ) {
        my $localization = $row->localizations->find($localization_id);

        unless ($localization) {
            my $json = to_json( { errors => 'Not found' } );
            output_with_http_headers $query, undef, $json, 'js', '404 Not Found';
            exit;
        }

        if ($localization) {
            $localization->delete();
            Koha::Caches->get_instance('localization')->clear_from_cache( "$source:" . $localization->lang );
        }

        $response->param(
            localization_id => $localization_id,
        );
    }

    C4::Service->return_success($response);
}

C4::Service->dispatch(
    [ 'PUT /',    [], \&update_translation ],
    [ 'POST /',   [], \&add_translation ],
    [ 'DELETE /', [], \&delete_translation ],
);
