package co.za.langalibalele.fuelmanagement;

import android.app.DatePickerDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Base64;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import com.google.android.material.button.MaterialButton;
import com.google.android.material.textfield.TextInputEditText;
import com.google.gson.Gson;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

import co.za.langalibalele.fuelmanagement.models.ApiResponse;
import co.za.langalibalele.fuelmanagement.utils.ApiClient;
import co.za.langalibalele.fuelmanagement.utils.SessionManager;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

import org.json.JSONObject;

public class FuelManagementActivity extends AppCompatActivity {

    private SessionManager sessionManager;
    private TextView driverNameText;
    private TextInputEditText dateInput, registrationInput;
    private AutoCompleteTextView busNoSpinner;
    private TextInputEditText openingKmInput, openingLtInput, openingAmountInput;
    private TextInputEditText closingKmInput, closingLtInput, closingAmountInput;
    private TextInputEditText totalAmountInput;
    private MaterialButton uploadPhotoButton, submitButton;
    private ImageView photoPreview;
    private View progressBar;

    private Calendar calendar;
    private String photoBase64 = "";
    private ActivityResultLauncher<Intent> cameraLauncher;
    private ActivityResultLauncher<Intent> galleryLauncher;

    private final String[] busNumbers = {
            "1001", "1002", "1003", "1004", "1006", "1007", "1008", "1012", "1013", "1014",
            "1015", "1010", "1011", "1016", "1018", "1020", "1201", "1202", "1203", "1204",
            "1205", "1206", "1207", "1208", "1209", "1210", "1211", "1221", "1222", "1300"
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fuel_management);

        sessionManager = new SessionManager(this);
        calendar = Calendar.getInstance();

        setupToolbar();
        initViews();
        setupUI();
        setupListeners();
        setupImagePickers();
    }

    private void setupToolbar() {
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        if (getSupportActionBar() != null) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        }
    }

    private void initViews() {
        driverNameText = findViewById(R.id.driverNameText);
        dateInput = findViewById(R.id.dateInput);
        registrationInput = findViewById(R.id.registrationInput);
        busNoSpinner = findViewById(R.id.busNoSpinner);
        openingKmInput = findViewById(R.id.openingKmInput);
        openingLtInput = findViewById(R.id.openingLtInput);
        openingAmountInput = findViewById(R.id.openingAmountInput);
        closingKmInput = findViewById(R.id.closingKmInput);
        closingLtInput = findViewById(R.id.closingLtInput);
        closingAmountInput = findViewById(R.id.closingAmountInput);
        totalAmountInput = findViewById(R.id.totalAmountInput);
        uploadPhotoButton = findViewById(R.id.uploadPhotoButton);
        submitButton = findViewById(R.id.submitButton);
        photoPreview = findViewById(R.id.photoPreview);
        progressBar = findViewById(R.id.progressBar);
    }

    private void setupUI() {
        // Set driver name
        driverNameText.setText(sessionManager.getDriverName());

        // Set today's date
        updateDateLabel();

        // Setup bus number dropdown
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this,
                android.R.layout.simple_dropdown_item_1line, busNumbers);
        busNoSpinner.setAdapter(adapter);
    }

    private void setupListeners() {
        dateInput.setOnClickListener(v -> showDatePicker());

        // Calculate total amount when amounts change
        TextWatcher amountWatcher = new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                calculateTotal();
            }

            @Override
            public void afterTextChanged(Editable s) {}
        };

        openingAmountInput.addTextChangedListener(amountWatcher);
        closingAmountInput.addTextChangedListener(amountWatcher);

        uploadPhotoButton.setOnClickListener(v -> showPhotoOptions());
        submitButton.setOnClickListener(v -> submitForm());
    }

    private void setupImagePickers() {
        cameraLauncher = registerForActivityResult(
                new ActivityResultContracts.StartActivityForResult(),
                result -> {
                    if (result.getResultCode() == RESULT_OK && result.getData() != null) {
                        Bundle extras = result.getData().getExtras();
                        Bitmap imageBitmap = (Bitmap) extras.get("data");
                        handleImage(imageBitmap);
                    }
                });

        galleryLauncher = registerForActivityResult(
                new ActivityResultContracts.StartActivityForResult(),
                result -> {
                    if (result.getResultCode() == RESULT_OK && result.getData() != null) {
                        Uri imageUri = result.getData().getData();
                        try {
                            Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), imageUri);
                            handleImage(bitmap);
                        } catch (IOException e) {
                            Toast.makeText(this, "Failed to load image", Toast.LENGTH_SHORT).show();
                        }
                    }
                });
    }

    private void showDatePicker() {
        DatePickerDialog datePickerDialog = new DatePickerDialog(
                this,
                (view, year, month, dayOfMonth) -> {
                    calendar.set(Calendar.YEAR, year);
                    calendar.set(Calendar.MONTH, month);
                    calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
                    updateDateLabel();
                },
                calendar.get(Calendar.YEAR),
                calendar.get(Calendar.MONTH),
                calendar.get(Calendar.DAY_OF_MONTH)
        );
        datePickerDialog.show();
    }

    private void updateDateLabel() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
        dateInput.setText(sdf.format(calendar.getTime()));
    }

    private void calculateTotal() {
        try {
            String openingAmtStr = openingAmountInput.getText().toString();
            String closingAmtStr = closingAmountInput.getText().toString();

            double openingAmt = openingAmtStr.isEmpty() ? 0 : Double.parseDouble(openingAmtStr);
            double closingAmt = closingAmtStr.isEmpty() ? 0 : Double.parseDouble(closingAmtStr);
            double total = openingAmt + closingAmt;

            totalAmountInput.setText(String.format(Locale.getDefault(), "%.2f", total));
        } catch (NumberFormatException e) {
            totalAmountInput.setText("0.00");
        }
    }

    private void showPhotoOptions() {
        String[] options = {"Camera", "Gallery", "Cancel"};
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Select Photo");
        builder.setItems(options, (dialog, which) -> {
            if (which == 0) {
                openCamera();
            } else if (which == 1) {
                openGallery();
            }
        });
        builder.show();
    }

    private void openCamera() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        cameraLauncher.launch(takePictureIntent);
    }

    private void openGallery() {
        Intent pickPhotoIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        galleryLauncher.launch(pickPhotoIntent);
    }

    private void handleImage(Bitmap bitmap) {
        photoPreview.setImageBitmap(bitmap);
        photoPreview.setVisibility(View.VISIBLE);

        // Convert to base64
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 80, baos);
        byte[] imageBytes = baos.toByteArray();
        photoBase64 = Base64.encodeToString(imageBytes, Base64.DEFAULT);
    }

    private void submitForm() {
        // Validate inputs
        if (dateInput.getText().toString().isEmpty()) {
            Toast.makeText(this, "Please select a date", Toast.LENGTH_SHORT).show();
            return;
        }
        if (registrationInput.getText().toString().isEmpty()) {
            Toast.makeText(this, "Please enter registration number", Toast.LENGTH_SHORT).show();
            return;
        }
        if (busNoSpinner.getText().toString().isEmpty()) {
            Toast.makeText(this, "Please select bus number", Toast.LENGTH_SHORT).show();
            return;
        }

        setLoading(true);

        try {
            JSONObject jsonData = new JSONObject();
            jsonData.put("driver_name", sessionManager.getDriverName());
            jsonData.put("date", dateInput.getText().toString());
            jsonData.put("registration_number", registrationInput.getText().toString());
            jsonData.put("bus_no", busNoSpinner.getText().toString());
            jsonData.put("opening_km", openingKmInput.getText().toString());
            jsonData.put("opening_lt", openingLtInput.getText().toString());
            jsonData.put("opening_amount", openingAmountInput.getText().toString());
            jsonData.put("closing_km", closingKmInput.getText().toString());
            jsonData.put("closing_lt", closingLtInput.getText().toString());
            jsonData.put("closing_amount", closingAmountInput.getText().toString());
            jsonData.put("total_amount", totalAmountInput.getText().toString());
            jsonData.put("slip_photo", photoBase64);

            OkHttpClient client = ApiClient.getClient();
            RequestBody body = RequestBody.create(
                    jsonData.toString(),
                    MediaType.parse("application/json; charset=utf-8")
            );

            Request request = new Request.Builder()
                    .url(ApiClient.getBaseUrl() + "save_fuel_entry.php")
                    .post(body)
                    .build();

            client.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    runOnUiThread(() -> {
                        setLoading(false);
                        Toast.makeText(FuelManagementActivity.this,
                                "Connection failed: " + e.getMessage(), Toast.LENGTH_SHORT).show();
                    });
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    String responseBody = response.body().string();

                    runOnUiThread(() -> {
                        setLoading(false);
                        try {
                            Gson gson = new Gson();
                            ApiResponse apiResponse = gson.fromJson(responseBody, ApiResponse.class);

                            if (apiResponse.isSuccess()) {
                                Toast.makeText(FuelManagementActivity.this,
                                        "Fuel entry saved successfully!", Toast.LENGTH_SHORT).show();
                                clearForm();
                            } else {
                                Toast.makeText(FuelManagementActivity.this,
                                        "Error: " + apiResponse.getMessage(), Toast.LENGTH_SHORT).show();
                            }
                        } catch (Exception e) {
                            Toast.makeText(FuelManagementActivity.this,
                                    "Invalid response from server", Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            });

        } catch (Exception e) {
            setLoading(false);
            Toast.makeText(this, "Error preparing data: " + e.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }

    private void clearForm() {
        registrationInput.setText("");
        busNoSpinner.setText("");
        openingKmInput.setText("");
        openingLtInput.setText("");
        openingAmountInput.setText("");
        closingKmInput.setText("");
        closingLtInput.setText("");
        closingAmountInput.setText("");
        totalAmountInput.setText("");
        photoPreview.setVisibility(View.GONE);
        photoBase64 = "";
        updateDateLabel();
    }

    private void setLoading(boolean loading) {
        progressBar.setVisibility(loading ? View.VISIBLE : View.GONE);
        submitButton.setEnabled(!loading);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            finish();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}
