/* Copyright 2014-2023 askanimus@gmail.com */

/* This File is part of "Arbeitszeitkonto" (askanimus.arbeitszeiterfassung2).
 *
 * "Arbeitszeitkonto" (askanimus.arbeitszeiterfassung2) is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * "Arbeitszeitkonto" (askanimus.arbeitszeiterfassung2) is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with "Arbeitszeitkonto" (askanimus.arbeitszeiterfassung2).  If not, see <http://www.gnu.org/licenses/>.
 *
 * Diese Datei ist Teil von "Arbeitszeitkonto" (askanimus.arbeitszeiterfassung2).
 *
 * "Arbeitszeitkonto" (askanimus.arbeitszeiterfassung2) ist Freie Software: Sie können es unter den Bedingungen
 * der GNU General Public License, wie von der Free Software Foundation,
 * Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren
 * veröffentlichten Version, weiter verteilen und/oder modifizieren.
 *
 * "Arbeitszeitkonto" (askanimus.arbeitszeiterfassung2) wird in der Hoffnung, dass es nützlich sein wird, aber
 * OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite
 * Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK.
 * Siehe die GNU General Public License für weitere Details.
 *
 * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem
 * Programm erhalten haben. Wenn nicht, siehe <https://www.gnu.org/licenses/>.
 */
package askanimus.arbeitszeiterfassung2.zusatzeintrag;

import android.annotation.SuppressLint;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.database.Cursor;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.RelativeLayout;
import android.widget.Spinner;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.DialogFragment;

import askanimus.arbeitszeiterfassung2.arbeitsplatz.Arbeitsplatz;
import askanimus.arbeitszeiterfassung2.datenbank.DatenbankHelper;
import askanimus.betterpickers.numberpicker.NumberPickerBuilder;
import askanimus.betterpickers.numberpicker.NumberPickerDialogFragment;

import java.math.BigDecimal;
import java.math.BigInteger;

import askanimus.arbeitszeiterfassung2.R;
import askanimus.arbeitszeiterfassung2.setup.ASettings;

public class Fragment_Dialog_Zusatzfeld_Edit
        extends
            DialogFragment
        implements
        NumberPickerDialogFragment.NumberPickerDialogHandlerV2,
        View.OnClickListener {
    Context mContext;
    private ZusatzfeldDefinition mZusatzfeld;
    //private int mEditZusatzfeldDialog_tag;
    private EditZusatzfeldDialogListener mListener;
    private boolean mIstNeu;

    private ZusatzfeldWirkungListAdapter mWirkungListAdapter;

    TextView tName;
    Spinner sTyp;
    TextView tEinheit;
    TextView tWirkung;
    Spinner sWirkung;
    TextView tSpalten;
    RelativeLayout bOptional;
    Arbeitsplatz mArbeitsplatz;

    public void setup(Arbeitsplatz job, ZusatzfeldDefinition zusatzfeld, EditZusatzfeldDialogListener listener, boolean isNeu){
       mZusatzfeld = zusatzfeld;
       //mEditZusatzfeldDialog_tag = tag;
       mListener = listener;
       mIstNeu = isNeu;
       mArbeitsplatz = job;
   }


    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = getContext();
        //setRetainInstance(true);
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        LayoutInflater inflater = LayoutInflater.from(getActivity());

        View mInhalt = inflater.inflate(R.layout.fragment_zusatzfeld_edit, null);
        //mInhalt.setBackgroundColor(mJob.getFarbe_Hintergrund());

        // die Felder suchen
        tName = mInhalt.findViewById(R.id.ZE_wert_name);
        sTyp = mInhalt.findViewById(R.id.ZE_spinner_typ);
        bOptional = mInhalt.findViewById(R.id.ZE_box_optional);
        tEinheit = mInhalt.findViewById(R.id.ZE_wert_einheit);
        tWirkung = mInhalt.findViewById(R.id.ZE_titel_wirkung);
        sWirkung = mInhalt.findViewById(R.id.ZE_spinner_wirkung);
        tSpalten = mInhalt.findViewById(R.id.ZE_wert_spalten);

        // Der Name des Zusatzfeldes
        tName.setText(mZusatzfeld.getName());

        //Der Typ des Zusatzfeldes
        int[] typenListe;
        String[] namenListe;

        if(!mIstNeu) {
            // nur mögliche Kandidaten zur Änderung des Feldtyps werden angezeigt
            switch (mZusatzfeld.getTyp()) {
                case IZusatzfeld.TYP_ZAHL:
                case IZusatzfeld.TYP_AUSWAHL_ZAHL:
                    namenListe = new String[]{getString(R.string.feld_typ_zahl), getString(R.string.feld_typ_zahl_auswahl)};
                    typenListe = new int[]{IZusatzfeld.TYP_ZAHL, IZusatzfeld.TYP_AUSWAHL_ZAHL};
                    break;
                case IZusatzfeld.TYP_ZEIT:
                case IZusatzfeld.TYP_AUSWAHL_ZEIT:
                    namenListe = new String[]{getString(R.string.feld_typ_zeit), getString(R.string.feld_typ_zeit_auswahl)};
                    typenListe = new int[]{IZusatzfeld.TYP_ZEIT, IZusatzfeld.TYP_AUSWAHL_ZEIT};
                    break;
                case IZusatzfeld.TYP_TEXT:
                case IZusatzfeld.TYP_AUSWAHL_TEXT:
                    namenListe = new String[]{getString(R.string.feld_typ_text), getString(R.string.feld_typ_text_auswahl)};
                    typenListe = new int[]{IZusatzfeld.TYP_TEXT, IZusatzfeld.TYP_AUSWAHL_TEXT};
                    break;
                case IZusatzfeld.TYP_PROZENT:
                case IZusatzfeld.TYP_AUSWAHL_PROZENT:
                    namenListe = new String[]{getString(R.string.feld_typ_prozent), getString(R.string.feld_typ_prozent_auswahl)};
                    typenListe = new int[]{IZusatzfeld.TYP_PROZENT, IZusatzfeld.TYP_AUSWAHL_PROZENT};
                    break;
                default:
                    if (mZusatzfeld.getTyp() == IZusatzfeld.TYP_BEREICH_ZAHL) {
                        namenListe = new String[]{getString(R.string.feld_typ_bereich_zahl)};
                    } else {
                        namenListe = new String[]{getString(R.string.feld_typ_bereich_zeit)};
                    }
                    typenListe = new int[]{mZusatzfeld.getTyp()};
                    sTyp.setEnabled(false);
            }
        } else {
            // das vollständige Typenmenü wird angezeigt
            // die Typenliste enthält die Typnummern in der Reihenfolge des angezeigten Typenmenüs
            typenListe = ASettings.res.getIntArray(R.array.zusatzfeld_typ_nummer);
            namenListe = ASettings.res.getStringArray(R.array.zusatzfeld_typ_menue);
        }
        sTyp.setAdapter(new ArrayAdapter<String>(
                mContext,
                android.R.layout.simple_spinner_item,
                namenListe
        ));
        int mTyp = mZusatzfeld.getTyp();
        for (int i = 0; i < typenListe.length; i++) {
            if (mTyp == typenListe[i]) {
                sTyp.setSelection(i);
                break;
            }
        }

        sTyp.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int item, long l) {
                int mTyp = typenListe[item];
                if(mTyp != mZusatzfeld.getTyp()) {
                    mZusatzfeld.setWirkung(IZusatzfeld.NEUTRAL);
                    sWirkung.setSelection(IZusatzfeld.NEUTRAL);
                    if(!mIstNeu) {
                        switch (mZusatzfeld.getTyp()) {
                            case IZusatzfeld.TYP_ZAHL:
                            case IZusatzfeld.TYP_AUSWAHL_ZAHL:
                            case IZusatzfeld.TYP_ZEIT:
                            case IZusatzfeld.TYP_AUSWAHL_ZEIT:
                            case IZusatzfeld.TYP_TEXT:
                            case IZusatzfeld.TYP_AUSWAHL_TEXT:
                            case IZusatzfeld.TYP_PROZENT:
                            case IZusatzfeld.TYP_AUSWAHL_PROZENT:
                                switchTyp(mTyp);
                                break;
                        }
                    }
                }
                switch (mTyp) {
                    case IZusatzfeld.TYP_BEREICH_ZAHL:
                    case IZusatzfeld.TYP_ZAHL:
                    case IZusatzfeld.TYP_AUSWAHL_ZAHL:
                        tWirkung.setText(getString(R.string.wirkung_verdienst));
                        bOptional.setVisibility(View.VISIBLE);
                        tEinheit.setText(mZusatzfeld.getEinheit());
                        tEinheit.setEnabled(true);
                        break;
                    case IZusatzfeld.TYP_BEREICH_ZEIT:
                    case IZusatzfeld.TYP_ZEIT:
                    case IZusatzfeld.TYP_AUSWAHL_ZEIT:
                        tWirkung.setText(getString(R.string.wirkung_zeiten));
                        bOptional.setVisibility(View.VISIBLE);
                        tEinheit.setText(ASettings.res.getString(R.string.k_stunde));
                        tEinheit.setEnabled(false);
                        break;
                    case IZusatzfeld.TYP_PROZENT:
                    case IZusatzfeld.TYP_AUSWAHL_PROZENT:
                        tWirkung.setText(getString(R.string.wirkung));
                        bOptional.setVisibility(View.VISIBLE);
                        tEinheit.setText("%");
                        tEinheit.setEnabled(false);
                        break;
                    default: // Textfeld bzw. Textfeld mit Auswahlliste
                        bOptional.setVisibility(View.GONE);
                        tEinheit.setText("");
                }
                mWirkungListAdapter.setTyp(mTyp);
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });

        // Die Einheit des Zusatzfeldes
        tEinheit.setText(mZusatzfeld.getEinheit());

        // Auswahl für die Wirkung des Zusatzfeldes
        mWirkungListAdapter = new ZusatzfeldWirkungListAdapter(mContext, mZusatzfeld.getTyp());
        sWirkung.setAdapter(mWirkungListAdapter);
        sWirkung.setSelection(mZusatzfeld.getWirkung());

        // Die Anzahl der Spalten
        tSpalten.setText(String.valueOf(mZusatzfeld.getColums()));
        tSpalten.setOnClickListener(this);


        // Den Dialog erstellen und zurück geben
        return new AlertDialog.Builder(mContext)
                /*.setTitle(R.string.dialog_soll_titel)*/
                .setView(mInhalt)
                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        mZusatzfeld.setName(tName.getText().toString());
                        mZusatzfeld.setTyp(typenListe[sTyp.getSelectedItemPosition()]);
                        mZusatzfeld.setEinheit(tEinheit.getText().toString());
                        mZusatzfeld.setWirkung(sWirkung.getSelectedItemPosition());
                        mZusatzfeld.setColums(Integer.parseInt(tSpalten.getText().toString()));
                        mZusatzfeld.speichern();
                        mListener.onEditZusatzwertPositiveClick(mZusatzfeld, mIstNeu);
                    }
                })
                .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        mListener.onEditZusatzwertNegativeClick();
                    }
                })
                .create();
    }

    @Override
    public void onClick(View view) {
        if (view.getId() == tSpalten.getId()) {
            NumberPickerBuilder mPicker = new NumberPickerBuilder()
                    .setFragmentManager(getParentFragmentManager())
                    .setStyleResId(ASettings.themePicker)
                    .setMinNumber(BigDecimal.valueOf(1))
                    .setMaxNumber(BigDecimal.valueOf(IZusatzfeld.MAX_COLUM))
                    .setLabelText(getString(R.string.spalten))
                    .setPlusMinusVisibility(View.INVISIBLE)
                    .setDecimalVisibility(View.INVISIBLE)
                    .setReference(666)
                    .setTargetFragment(this);
            mPicker.show();
        }
    }

    @Override
    public void onDialogNumberSet(int reference, BigInteger number, double decimal, boolean isNegative, BigDecimal fullNumber) {
        if(reference == 666){
           tSpalten.setText(String.valueOf(number));
        }
    }

    @SuppressLint("Range")
    private void switchTyp(int typNeu){
        int i = mZusatzfeld.getTyp() - typNeu;
        // es kann nur zwischen gleichen Feldtypen gewechselt werden (mit oder ohne Auswahlliste)
        if(i == 10){
            // der alte Typ war mit Auswahlliste, der neue ist ohne Auswahlliste
            // die Auswahlliste muss gelöscht werden
            ASettings.mDatenbank.delete(
                    DatenbankHelper.DB_T_ZUSATZWERT_AUSWAHL,
                    DatenbankHelper.DB_F_ZUSATZFELD + " = ?",
                    new String[]{String.valueOf(mZusatzfeld.getID())}
            );
        } else if (i == -10) {
            // der alte Typ war ohne Auswahlliste, der neue mit Auswahlliste
            // es muss eine Auswahlliste aus allen eingetragenen Werten erstellt werden
            // Texte werden an den Kommas aufgeteilt
            Cursor werte = ASettings.mDatenbank.rawQuery(
                    "select " +
                            DatenbankHelper.DB_F_WERT +
                            " from "
                            + DatenbankHelper.DB_T_ZUSATZWERT
                            + " where "
                            + DatenbankHelper.DB_F_ZUSATZFELD
                            + " = ?",
                    new String[]{String.valueOf(mZusatzfeld.getID())}
            );
            if (werte.getCount() > 0) {
                ZusatzWertAuswahlListe auswahlListe = new ZusatzWertAuswahlListe(mZusatzfeld, mArbeitsplatz);
                while (werte.moveToNext()) {
                    switch (typNeu){
                        case IZusatzfeld.TYP_AUSWAHL_TEXT:
                        case IZusatzfeld.TYP_AUSWAHL_ZAHL:
                        case IZusatzfeld.TYP_AUSWAHL_ZEIT:
                        case IZusatzfeld.TYP_AUSWAHL_PROZENT:
                            ZusatzWertAuswahlListe.zusatzWertAuswahlItem itemNeu = new ZusatzWertAuswahlListe.zusatzWertAuswahlItem();
                            IZusatzfeld feldNeu = mZusatzfeld.makeNewZusatzfeld();
                            feldNeu.getDefinition().setTyp(typNeu);
                            feldNeu.setWert(
                                    werte.getString(werte.getColumnIndex(DatenbankHelper.DB_F_WERT))
                            );
                            itemNeu.setWert(feldNeu);
                            auswahlListe.addWert(itemNeu);
                            break;
                    }
                }
            }
            werte.close();
        }
    }

    public interface EditZusatzfeldDialogListener{
		void onEditZusatzwertPositiveClick(ZusatzfeldDefinition zusatzFeld, boolean isNeu);

		void onEditZusatzwertNegativeClick();
    }

}
