package org.apache.fineract.data.datamanager.api;

import org.apache.fineract.FakeRemoteDataSource;
import org.apache.fineract.data.datamanager.contracts.ManagerCustomer;
import org.apache.fineract.data.local.PreferencesHelper;
import org.apache.fineract.data.local.database.helpers.DatabaseHelperCustomer;
import org.apache.fineract.data.models.customer.Command;
import org.apache.fineract.data.models.customer.Customer;
import org.apache.fineract.data.models.customer.CustomerPage;
import org.apache.fineract.data.models.customer.identification.Identification;
import org.apache.fineract.data.models.customer.identification.ScanCard;
import org.apache.fineract.data.remote.BaseApiManager;

import java.util.List;

import javax.inject.Inject;
import javax.inject.Singleton;

import io.reactivex.Completable;
import io.reactivex.CompletableObserver;
import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.functions.Function;
import okhttp3.MultipartBody;

/**
 * @author Rajan Maurya
 *         On 20/06/17.
 */
@Singleton
public class DataManagerCustomer extends FineractBaseDataManager implements ManagerCustomer {

    private final BaseApiManager baseApiManager;
    private final PreferencesHelper preferencesHelper;
    private final DatabaseHelperCustomer databaseHelper;

    @Inject
    public DataManagerCustomer(BaseApiManager baseApiManager, PreferencesHelper preferencesHelper,
                           DataManagerAuth dataManagerAuth, DatabaseHelperCustomer databaseHelper) {
        super(dataManagerAuth, preferencesHelper);
        this.baseApiManager = baseApiManager;
        this.preferencesHelper = preferencesHelper;
        this.databaseHelper = databaseHelper;
    }

    public Observable<CustomerPage> fetchCustomers(Integer pageIndex, Integer size) {
        return authenticatedObservableApi(baseApiManager.getCustomerApi()
                .fetchCustomers(pageIndex, size))
                .onErrorResumeNext(
                        new Function<Throwable, ObservableSource<CustomerPage>>() {
                            @Override
                            public ObservableSource<CustomerPage> apply(
                                    Throwable throwable) throws Exception {
                                return Observable.just(FakeRemoteDataSource.getCustomerPage());
                            }
                    });
    }

    public Observable<Customer> fetchCustomer(String identifier) {
        return authenticatedObservableApi(baseApiManager.getCustomerApi()
                .fetchCustomer(identifier))
                .onErrorResumeNext(
                        new Function<Throwable, ObservableSource<Customer>>() {
                            @Override
                            public ObservableSource<Customer> apply(
                                    Throwable throwable) throws Exception {
                                return Observable.just(FakeRemoteDataSource.getCustomer());
                            }
                    });
    }

    public Completable updateCustomer(String customerIdentifier, Customer customer) {
        return authenticatedCompletableApi(baseApiManager.getCustomerApi()
                .updateCustomer(customerIdentifier, customer));
    }

    public Observable<CustomerPage> searchCustomer(Integer pageIndex, Integer size, String term) {
        return authenticatedObservableApi(baseApiManager.getCustomerApi()
                .searchCustomer(pageIndex, size, term));
    }

    public Completable createCustomer(final Customer customer) {
        return authenticatedCompletableApi(
                baseApiManager.getCustomerApi().createCustomer(customer))
                .andThen(new Completable() {
                    @Override
                    protected void subscribeActual(CompletableObserver s) {
                        databaseHelper.deleteCustomerPayload(customer);
                    }
                });
    }

    public Completable customerCommand(String identifier, Command command) {
        return authenticatedCompletableApi(baseApiManager.getCustomerApi()
                .customerCommand(identifier, command));
    }

    public Observable<List<Command>> fetchCustomerCommands(String customerIdentifier) {
        return authenticatedObservableApi(baseApiManager.getCustomerApi()
                .fetchCustomerCommands(customerIdentifier))
                .onErrorResumeNext(
                        new Function<Throwable, ObservableSource<List<Command>>>() {
                            @Override
                            public ObservableSource<List<Command>> apply(
                                    Throwable throwable) throws Exception {
                                return Observable.just(FakeRemoteDataSource.getCustomerCommands());
                            }
                        });
    }

    public Observable<List<Identification>> fetchIdentifications(String customerIdentifier) {
        return authenticatedObservableApi(baseApiManager.getCustomerApi()
                .fetchIdentification(customerIdentifier))
                .onErrorResumeNext(new Function<Throwable,
                        ObservableSource<List<Identification>>>() {
                    @Override
                    public ObservableSource<List<Identification>> apply(
                            Throwable throwable)
                            throws Exception {
                        return Observable.just(FakeRemoteDataSource.getIdentifications());
                    }
                });
    }

    public Observable<Identification> searchIdentifications(String identifier, String number) {
        return authenticatedObservableApi(baseApiManager.getCustomerApi()
                    .searchIdentification(identifier, number))
                    .onErrorResumeNext(
                            new Function<Throwable, ObservableSource<Identification>>() {
                                @Override
                                public ObservableSource<Identification> apply(
                                        Throwable throwable) throws Exception {
                                    return Observable.just(FakeRemoteDataSource
                                            .getIdentifications().get(0));
                                }
                            });
    }

    public Completable createIdentificationCard(String identifier, Identification identification) {
        return authenticatedCompletableApi(baseApiManager.getCustomerApi()
                .createIdentificationCard(identifier, identification));
    }

    public Completable updateIdentificationCard(String customerIdentifier,
            String identificationNumber, Identification identification) {
        return authenticatedCompletableApi(baseApiManager.getCustomerApi().updateIdentificationCard(
                customerIdentifier, identificationNumber, identification));
    }

    public Observable<List<ScanCard>> fetchIdentificationScanCards(String customerIdentifier,
            String identificationNumber) {
        return authenticatedObservableApi(baseApiManager.getCustomerApi()
                .fetchIdentificationScanCards(customerIdentifier, identificationNumber))
                .onErrorResumeNext(
                        new Function<Throwable, ObservableSource<List<ScanCard>>>() {
                            @Override
                            public ObservableSource<List<ScanCard>> apply(
                                    Throwable throwable) throws Exception {
                                return Observable.just(FakeRemoteDataSource.getScanCards());
                            }
                        });
    }

    public Completable uploadIdentificationCardScan(String customerIdentifier,
            String identificationNumber, String scanIdentifier, String description,
            MultipartBody.Part file) {
        return authenticatedCompletableApi(baseApiManager.getCustomerApi()
                .uploadIdentificationCardScan(customerIdentifier, identificationNumber,
                        scanIdentifier, description, file));
    }

    public Completable deleteIdentificationCardScan(String customerIdentifier,
            String identificationNumber, String scanIdentifier) {
        return authenticatedCompletableApi(baseApiManager.getCustomerApi()
                .deleteIdentificationCardScan(customerIdentifier, identificationNumber,
                        scanIdentifier));
    }

    public Completable deleteIdentificationCard(
            String customerIdentifier, String identificationnumber) {
        return authenticatedCompletableApi(baseApiManager.getCustomerApi()
                .deleteIdentificationCard(customerIdentifier, identificationnumber));
    }

    public Completable uploadCustomerPortrait(String customerIdentifier, MultipartBody.Part file) {
        return authenticatedCompletableApi(baseApiManager.getCustomerApi()
                .uploadCustomerPortrait(customerIdentifier, file));
    }

    public Completable deleteCustomerPortrait(String customerIdentifier) {
        return authenticatedCompletableApi(baseApiManager.getCustomerApi()
                .deleteCustomerPortrait(customerIdentifier));
    }
}
