package org.coolreader.crengine;

import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.RatingBar;
import android.widget.TextView;

import org.coolreader.CoolReader;
import org.coolreader.R;
import org.coolreader.plugins.BookInfoCallback;
import org.coolreader.plugins.DownloadBookCallback;
import org.coolreader.plugins.OnlineStoreBook;
import org.coolreader.plugins.OnlineStoreBookInfo;
import org.coolreader.plugins.OnlineStorePluginManager;
import org.coolreader.plugins.OnlineStoreWrapper;
import org.coolreader.plugins.PurchaseBookCallback;

import java.io.File;

public class OnlineStoreBookInfoDialog extends BaseDialog {
	private CoolReader mActivity;
	private OnlineStoreBookInfo mBookInfo;
	private FileInfo mFileInfo;
	private LayoutInflater mInflater;
	private int mWindowSize;
	private OnlineStoreWrapper mPlugin;
	private File downloadDir;
	private File downloadTrialDir;
	private File downloadFilename;
	private File downloadTrialFilename;
	
	private ViewGroup mContentView;
	
	public OnlineStoreBookInfoDialog(CoolReader activity, OnlineStoreBookInfo book, FileInfo fileInfo)
	{
		super(activity, null, false, false);
		DisplayMetrics outMetrics = new DisplayMetrics();
		activity.getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
		this.mWindowSize = Math.min(outMetrics.widthPixels, outMetrics.heightPixels);
		this.mActivity = activity;
		this.mBookInfo = book;
		this.mFileInfo = fileInfo;
		this.mPlugin = OnlineStorePluginManager.getPlugin(mActivity, fileInfo.getOnlineCatalogPluginPackage());
		File baseDir = new File(Services.getScanner().getDownloadDirectory().pathname);
		this.downloadDir = new File(baseDir, mPlugin.getDescription());
		this.downloadFilename = new File(downloadDir, book.book.downloadFileName);
		this.downloadTrialDir = new File(baseDir, mPlugin.getDescription() + "-trials");
		this.downloadTrialFilename = book.book.trialFileName != null ? new File(downloadTrialDir, book.book.trialFileName) : null;
	}

	@Override
	protected void onCreate() {
        setCancelable(true);
        setCanceledOnTouchOutside(true);

        super.onCreate();
	}
	
	RatingBar rbBookRating;
    Button btnBuyOrDownload;
    Button btnPreview;
    TextView lblTitle;
    TextView lblSeries;
    TextView lblAuthors;
    TextView lblFileInfo;
    TextView lblLogin;
    TextView lblStatus;
    TextView lblBalance;
    TextView lblPrice;
    TextView lblNormalPrice;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

        mInflater = LayoutInflater.from(getContext());
        ViewGroup view = (ViewGroup)mInflater.inflate(R.layout.online_store_book_info_dialog, null);
        mContentView = view;
        
        ImageButton btnBack = view.findViewById(R.id.base_dlg_btn_back);
        btnBack.setOnClickListener(v -> onNegativeButtonClick());
        btnBuyOrDownload = view.findViewById(R.id.btn_buy);
        btnBuyOrDownload.setOnClickListener(v -> onBuyButtonClick());
        btnPreview = view.findViewById(R.id.btn_preview);
        btnPreview.setOnClickListener(v -> onPreviewButtonClick());
        lblTitle = view.findViewById(R.id.lbl_book_title);
        lblSeries = view.findViewById(R.id.lbl_book_series);
        lblAuthors = view.findViewById(R.id.lbl_book_author);
        lblFileInfo = view.findViewById(R.id.lbl_book_file_info);
        lblLogin = view.findViewById(R.id.lbl_login);
        lblStatus = view.findViewById(R.id.lbl_status);
        lblBalance = view.findViewById(R.id.lbl_balance);
        lblPrice = view.findViewById(R.id.lbl_price);
        lblNormalPrice = view.findViewById(R.id.lbl_normal_price);
        rbBookRating = view.findViewById(R.id.book_rating);

        final ImageView image = view.findViewById(R.id.book_cover);
        int w = mWindowSize * 4 / 10;
        int h = w * 4 / 3;
        image.setMinimumHeight(h);
        image.setMaxHeight(h);
        image.setMinimumWidth(w);
        image.setMaxWidth(w);
        Bitmap bmp = Bitmap.createBitmap(w, h, Config.RGB_565);
        Services.getCoverpageManager().drawCoverpageFor(mActivity.getDB(), mFileInfo, bmp, false, (file, bitmap) -> {
			BitmapDrawable drawable = new BitmapDrawable(bitmap);
			image.setImageDrawable(drawable);
		});

        if (mBookInfo.book.rating > 0)
        	rbBookRating.setRating(mBookInfo.book.rating / 2.0f);
        else
        	rbBookRating.setVisibility(View.GONE);
		progress = new ProgressPopup(mActivity, mContentView);
        updateInfo();
        setView(view);
	}
	
	private String getString(int resourceId) {
		return getContext().getString(resourceId);
	}
	
	private void updateInfo() {
		lblTitle.setText(mBookInfo.book.bookTitle);
		lblAuthors.setText(Utils.formatAuthorsNormalNames(mBookInfo.book.getAuthors()));
		lblSeries.setText(mBookInfo.book.getSeries());
        lblLogin.setText(mBookInfo.isLoggedIn ? mBookInfo.login : getString(R.string.online_store_please_login));
        lblBalance.setText(mBookInfo.isLoggedIn ? getString(R.string.online_store_balance) + " " + mBookInfo.accountBalance : "");
        lblStatus.setText(mBookInfo.isPurchased ? getString(R.string.online_store_status_purchased) : "");
        lblPrice.setText(mBookInfo.book.price > 0 ? getString(R.string.online_store_price) + " " + mBookInfo.book.price : getString(R.string.online_store_status_free));
        lblNormalPrice.setText(mBookInfo.book.price != mBookInfo.book.basePrice ? String.valueOf(mBookInfo.book.basePrice) : "");
        lblNormalPrice.setPaintFlags(lblNormalPrice.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
        lblFileInfo.setText(Utils.formatSize(mBookInfo.book.zipSize));
        if (mBookInfo.book.trialUrl == null)
        	btnPreview.setVisibility(View.GONE);
        else {
        	if (bookFileExists(true))
        		btnPreview.setText(R.string.online_store_open_trial);
        	else
        		btnPreview.setText(R.string.online_store_download_trial);
        }
        if (bookFileExists(false)) {
			btnBuyOrDownload.setText(R.string.online_store_open);
        } else if (mBookInfo.isLoggedIn) {
			if (mBookInfo.isPurchased) {
				btnBuyOrDownload.setText(R.string.online_store_download);
			} else {
				btnBuyOrDownload.setText(R.string.online_store_buy);
			}
		} else {
			btnBuyOrDownload.setText(R.string.online_store_login);
		}
	}
	
	@Override
	protected void onPositiveButtonClick() {
		super.onPositiveButtonClick();
	}

	@Override
	protected void onNegativeButtonClick() {
		super.onNegativeButtonClick();
	}

	
	protected void onBuyButtonClick() {
		if (bookFileExists(false)) {
			openBook(false);
		} else if (mBookInfo.isLoggedIn) {
			if (mBookInfo.isPurchased) {
				download(false);
			} else {
				// buy
				mActivity.askConfirmation(getString(R.string.online_store_price) + " " + mBookInfo.book.price + " " + getString(R.string.online_store_confirm_purchase), () -> {
					String bookId = mFileInfo.getOnlineCatalogPluginId();
					progress.show();
					mPlugin.purchaseBook(bookId, new PurchaseBookCallback() {
						@Override
						public void onError(int errorCode, String errorMessage) {
							progress.hide();
							mActivity.showToast(getString(R.string.online_store_purchase_error) + ": " + errorMessage);
						}

						@Override
						public void onBookPurchased(String bookId, double newAccountBalance) {
							progress.hide();
							mBookInfo.accountBalance = newAccountBalance;
							mBookInfo.isPurchased = true;
							updateInfo();
							mActivity.showToast(getString(R.string.online_store_confirm_purchase) + " " + getString(R.string.online_store_purchase_new_balance) + " " + newAccountBalance);
						}

						@Override
						public void onLowBalance(String bookId, double accountBalance, double bookPrice) {
							progress.hide();
							final String refillUrl = mPlugin.getAccountRefillUrl();
							if (refillUrl != null) {
								mActivity.askConfirmation(R.string.online_store_refill_account_balance_request_litres, () -> {
									try {
										Uri uri = Uri.parse(refillUrl);
										Intent myIntent = new Intent(Intent.ACTION_VIEW, uri);
										mActivity.startActivity(myIntent);
									} catch (ActivityNotFoundException e) {
										mActivity.showToast("Cannot open web page");
									}
								});
							} else {
								mActivity.showToast("Not enough money on account");
							}
						}

					});
				});
			}
		} else {
			// LOGIN
			OnlineStoreLoginDialog dlg = new OnlineStoreLoginDialog(mActivity, mPlugin, this::reloadBookInfo);
			dlg.show();
		}
	}
	
	private ProgressPopup progress;
	
	private void reloadBookInfo() {
		String bookId = mFileInfo.getOnlineCatalogPluginId();
		progress.show();
		mPlugin.loadBookInfo(bookId, new BookInfoCallback() {
			@Override
			public void onError(int errorCode, String errorMessage) {
				progress.hide();
				mActivity.showToast("Error while loading book info");
			}
			
			@Override
			public void onBookInfoReady(OnlineStoreBookInfo bookInfo) {
				progress.hide();
				mBookInfo = bookInfo;
				updateInfo();
			}
		});
	}
	
	protected void onPreviewButtonClick() {
		if (bookFileExists(true))
			openBook(true);
		else
			download(true);
	}
	
	private boolean ensureDownloadDirectoryExists(boolean trial) {
		File dir = (trial ? downloadTrialDir : downloadDir);
		if (dir.isDirectory())
			return true;
		return dir.mkdirs();
	}
	
	private File getBookFile(boolean trial) {
		return (trial ? downloadTrialFilename : downloadFilename);
	}
	
	private boolean bookFileExists(boolean trial) {
		return getBookFile(trial).exists();
	}
	
	private void download(final boolean trial) {
		File f = getBookFile(trial);
		if (!ensureDownloadDirectoryExists(trial)) {
			mActivity.showToast("Cannot create download directory " + f.getAbsolutePath());
			return;
		}
		progress.show();
		mPlugin.downloadBook(mBookInfo.book, trial, f, new DownloadBookCallback() {
			@Override
			public void onError(int errorCode, String errorMessage) {
				progress.hide();
				mActivity.showToast("Error while downloading book: " + errorMessage);
			}
			
			@Override
			public void onBookDownloaded(OnlineStoreBook book, boolean trial,
					File savedFileName) {
				progress.hide();
				openBook(trial);
			}
		});
	}
	
	private void openBook(boolean trial) {
		File book = getBookFile(trial);
//		FileInfo fileInfo = new FileInfo(book);
//		FileInfo parent = Services.getScanner().findParent(fileInfo, Services.getScanner().getRoot());
//		FileInfo bookFileInfo = parent.findItemByPathName(book.getAbsolutePath());
		dismiss();
		mActivity.loadDocument(book.getAbsolutePath(), null, null, true);
	}
}

