package de.t_dankworth.secscanqr.activities;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import androidx.annotation.NonNull;
import com.google.android.material.bottomnavigation.BottomNavigationItemView;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.bottomnavigation.LabelVisibilityMode;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.journeyapps.barcodescanner.BarcodeEncoder;

import androidx.appcompat.app.AppCompatActivity;

import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.EnumMap;
import java.util.Map;

import de.t_dankworth.secscanqr.R;
import de.t_dankworth.secscanqr.activities.generator.GeneratorResultActivity;
import de.t_dankworth.secscanqr.util.DatabaseHelper;
import de.t_dankworth.secscanqr.util.GeneralHandler;

import static de.t_dankworth.secscanqr.util.ButtonHandler.copyToClipboard;
import static de.t_dankworth.secscanqr.util.ButtonHandler.createContact;
import static de.t_dankworth.secscanqr.util.ButtonHandler.openInWeb;
import static de.t_dankworth.secscanqr.util.ButtonHandler.shareTo;

/**
* Created by Thore Dankworth
* Last Update: 20.05.2020
* Last Update by Thore Dankworth
*
* This class is the HistoryDetailsActivity shows details and further functionality for the chosen item
*/

public class HistoryDetailsActivity extends AppCompatActivity {

    private GeneralHandler generalHandler;

    public static final String EXTRA_FORMAT =
            "de.t-dankworth.secscanqr.EXTRA_FORMAT";
    public static final String EXTRA_INFORMATION =
            "de.t-dankworth.secscanqr.EXTRA_INFORMATION";

    private TextView tvCode, tvFormat;
    private ImageView codeImage;
    private BottomNavigationView action_navigation;
    Bitmap bitmap;
    MultiFormatWriter multiFormatWriter;

    DatabaseHelper historyDatabaseHelper;
    final Activity activity = this;

    private String selectedCode, selectedFormat;

    /**
     * This method handles the main navigation
     */
    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
            = new BottomNavigationView.OnNavigationItemSelectedListener() {

        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()) {
                //Following cases using a method from ButtonHandler
                case R.id.history_action_navigation_copy:
                    copyToClipboard(tvCode, selectedCode, activity);
                    return true;
                case R.id.history_action_navigation_openInWeb:
                    openInWeb(selectedCode, activity);
                    return true;
                case R.id.history_action_navigation_createContact:
                    createContact(selectedCode, activity);
                    return true;
                case R.id.history_action_navigation_share:
                    shareTo(selectedCode, activity);
                    return true;
            }
            return false;
        }

    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        generalHandler = new GeneralHandler(this);
        generalHandler.loadTheme();
        setContentView(R.layout.activity_history_details);
        tvCode = (TextView) findViewById(R.id.tvTxtqrcodeHistory);
        tvFormat = (TextView) findViewById(R.id.tvFormatHistory);
        codeImage = (ImageView) findViewById(R.id.resultImageHistory);
        codeImage.setClickable(true);

        action_navigation = (BottomNavigationView) findViewById(R.id.history_action_navigation);
        action_navigation.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
        action_navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
        historyDatabaseHelper = new DatabaseHelper(this);

        //Get the extra information from the history listview. and set the text in the textview eqaul to code
        Intent receivedIntent = getIntent();
        selectedCode = receivedIntent.getStringExtra(EXTRA_INFORMATION);
        tvCode.setText(selectedCode);
        selectedFormat = receivedIntent.getStringExtra(EXTRA_FORMAT);
        tvFormat.setText(selectedFormat);
        showQrImage();

        if(selectedCode.contains("BEGIN:VCARD") & selectedCode.contains("END:VCARD")){
            action_navigation.getMenu().removeItem(R.id.history_action_navigation_openInWeb);
        } else {
            action_navigation.getMenu().removeItem(R.id.history_action_navigation_createContact);
        }

        codeImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(HistoryDetailsActivity.this , GeneratorResultActivity.class);
                Bundle bundle = new Bundle();
                bundle.putString("CODE", selectedCode);
                int formatID = generalHandler.StringToBarcodeId(selectedFormat);
                bundle.putInt("FORMAT", formatID);
                intent.putExtras(bundle);
                startActivity(intent);
            }
        });
    }

    /**
     * This method creates a picture of the scanned qr code
     */
    private void showQrImage() {
        multiFormatWriter = new MultiFormatWriter();
        Map<EncodeHintType, Object> hintMap = new EnumMap<EncodeHintType, Object>(EncodeHintType.class);

        hintMap.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        hintMap.put(EncodeHintType.MARGIN, 1); /* default = 4 */
        hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
        try{
            BarcodeFormat format = generalHandler.StringToBarcodeFormat(selectedFormat);
            BitMatrix bitMatrix = multiFormatWriter.encode(selectedCode, format, 250,250, hintMap);
            BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
            bitmap = barcodeEncoder.createBitmap(bitMatrix);
            codeImage.setImageBitmap(bitmap);
        } catch (Exception e){
            codeImage.setVisibility(View.GONE);
        }
    }
}