from flask_app import app
from flask import Flask, send_file, jsonify, request
from flask_cors import CORS
from google.oauth2 import service_account
from googleapiclient.discovery import build,MediaFileUpload
from googleapiclient.http import MediaIoBaseDownload
from flask_cors import CORS
from configs.databaseConnection import connect_to_database
import io
import os

CORS(app, origins="*")

SCOPES = ['https://www.googleapis.com/auth/drive']
SERVICE_ACCOUNT_FILE = 'configs/credentials.json'

# Authenticate and build the Drive API client
def get_drive_service():
    credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    service = build('drive', 'v3', credentials=credentials)
    return service

@app.route("/api/file/download", methods=['GET'])
def file_download():
    try:
        print("file download method starts")
        service = get_drive_service()
        file_name = "template.xlsx"
        print("Before results")
        # Search for the file by name
        results = service.files().list(
            q=f"name='{file_name}'",
            spaces='drive',
            fields='files(id, name)'
        ).execute()
        #print("result",results)
        app.logger.info('results: %s',results)
        items = results.get('files', [])
        if not items:
            return jsonify({'error': 'File not found'}), 404
        
        #print("item",items[0]['id'])
        file_id = items[0]['id']
        print("fileid",file_id)
        # Export the file to XLSX format
        #application/vnd.ms-excel
        #application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
        
        #list_drive_files(service)
        request = service.files().get_media(fileId=file_id)
        #request = service.files().export_media(fileId=file_id, mimeType='application/vnd.ms-excel')
        print("request",str(request))
        fh = io.BytesIO()
        downloader = MediaIoBaseDownload(fh, request)
        
        #print("download",fh.getvalue().decode('utf-8'))
        done = False
        while done is False:
            status, done = downloader.next_chunk()
            fh.seek(0)
        #attachment_filename='template.xlsx'    
        return send_file(
            fh,
            mimetype='application/vnd.ms-excel',
            as_attachment=True,
            attachment_filename=file_name
        )
    except Exception as e:
        print(e)
        app.logger.error(e, stack_info=True, exc_info=True)
        return jsonify(error=str(e)), 500


@app.route('/api/download/status', methods=['GET'])
def download_status():
    try:
        print("Status Method Starts")
        service = get_drive_service()
        file_id = request.args.get('file_id')
        print("file Id",file_id)
        file_request = service.files().get_media(fileId=file_id)
        fh = io.BytesIO()
        downloader = MediaIoBaseDownload(fh, file_request)
        file_metadata = service.files().get(fileId=file_id, fields='id, name').execute()

        file_name = file_metadata.get('name')

        done = False
        while done is False:
            status, done = downloader.next_chunk()
            app.logger.info('Download: %d',(int(status.progress() * 100)))

        fh.seek(0)
        return send_file(
            fh,
            mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            as_attachment=True,
            attachment_filename='template.xlsx'
        )
    except Exception as e:
        app.logger.error(e, stack_info=True, exc_info=True)
        return jsonify(error=str(e)), 500


def list_drive_files(service):
    print("📂 Listing files in Google Drive...")

    results = service.files().list(
        pageSize=100,
        fields="files(id, name)"
    ).execute()

    files = results.get('files', [])
    
    if not files:
        print("📭 No files found.")
    else:
        print(f"📁 Found {len(files)} file(s):")
        for file in files:
            print(f"🗎 {file['name']} (ID: {file['id']})")
