import pandas as pd
from flask import Flask, request, render_template_string
import os

app = Flask(__name__)

# Directory to store converted CSV files
UPLOAD_FOLDER = 'converted_files'
os.makedirs(UPLOAD_FOLDER, exist_ok=True)

@app.route('/')
def index():
    return '''
        <h2>Upload Excel File</h2>
        <form action="/upload" method="post" enctype="multipart/form-data">
            <input type="file" name="file">
            <br><br>
            <input type="text" name="tracking_no" placeholder="Enter Tracking No">
            <br><br>
            <input type="submit" value="Upload">
        </form>
    '''

@app.route('/upload', methods=['POST'])
def upload_file():
    if 'file' not in request.files or 'tracking_no' not in request.form:
        return "No file or tracking number provided.", 400

    file = request.files['file']
    tracking_no = request.form['tracking_no']
    filename = file.filename

    if not filename.endswith(('.xls', '.xlsx')):
        return "Unsupported file type. Please upload an Excel file.", 400

    try:
        # Read all sheets from the Excel file with no header
        file.seek(0)  # Reset file pointer
        sheet_data = pd.read_excel(file, sheet_name=None, header=None, dtype=str)

        result_html = "<h2>Tracking Information</h2>"

        # Flag to track if the tracking number is found
        tracking_found = False
        mail_bag_no = None  # To store the Mail Bag No if found

        # Process each sheet
        for sheet_name, df in sheet_data.items():
            # Iterate through every row and column to search for the tracking number
            for row_idx, row in df.iterrows():
                for col_idx, cell in row.items():
                    # Convert cell to string before searching
                    cell_str = str(cell)

                    # Check if the tracking number exists in the current cell
                    if tracking_no.lower() in cell_str.lower():
                        tracking_found = True
                        # Adjusting the row and column for user-friendly display (starting from 1)
                        adjusted_row_idx = row_idx + 1
                        adjusted_col_idx = col_idx + 1
                        result_html += f"<h3>Tracking No: {tracking_no} found in sheet '{sheet_name}'</h3>"
                        result_html += f"<p><strong>Row {adjusted_row_idx}, Column {adjusted_col_idx}:</strong> {cell_str}</p>"

                        # Fetch Mail Bag No from rows 4 and 5, columns C and D (non-zero-based indexing)
                        try:
                            mail_bag_no_parts = [
                                str(df.iloc[3, 2]) if not pd.isna(df.iloc[3, 2]) else "",
                                str(df.iloc[3, 3]) if not pd.isna(df.iloc[3, 3]) else ""
                            ]
                            mail_bag_no = " ".join(part for part in mail_bag_no_parts if part.strip())
                        except IndexError:
                            mail_bag_no = None

                        # Break inner loops once tracking number is found
                        break
                if tracking_found:
                    break
            if tracking_found:
                break

        # Display the Mail Bag No if found
        if tracking_found and mail_bag_no:
            result_html += f"<p><strong>Mail Bag No:</strong> {mail_bag_no}</p>"
        elif tracking_found:
            result_html += f"<p><strong>Mail Bag No:</strong> Not found</p>"
        else:
            # If no tracking number was found, display a message
            result_html += f"<p>No data found for Tracking No: {tracking_no}</p>"

        return render_template_string(result_html)

    except Exception as e:
        return f"Error processing file: {e}", 500


if __name__ == '__main__':
    app.run(debug=True, port=5000, host='0.0.0.0')