from flask import Flask, request, jsonify, send_file, session, redirect, url_for
from flask_cors import CORS
import os
import time
import json
from db_operations import DatabaseManager
from music_scanner import MusicScanner
import configparser

# Load configuration
config = configparser.ConfigParser()
config.read('config.ini')

app = Flask(__name__)
app.secret_key = config['app']['secret_key']
CORS(app)

# Initialize database manager
db_manager = DatabaseManager(config['database']['path'])

@app.route('/api/login', methods=['POST'])
def login():
    """Authenticate user"""
    data = request.json
    username = data.get('username')
    password = data.get('password')
    
    user = db_manager.authenticate_user(username, password)
    
    if user:
        session['user_id'] = user['id']
        session['username'] = user['username']
        return jsonify({
            'success': True,
            'user': user
        })
    
    return jsonify({
        'success': False,
        'message': 'Invalid username or password'
    }), 401

@app.route('/api/logout', methods=['POST'])
def logout():
    """Log out user"""
    session.clear()
    return jsonify({'success': True})

@app.route('/api/user', methods=['GET'])
def get_user():
    """Get current user info"""
    if 'user_id' not in session:
        return jsonify({'authenticated': False}), 401
    
    return jsonify({
        'authenticated': True,
        'user': {
            'id': session['user_id'],
            'username': session['username']
        }
    })

@app.route('/api/scan', methods=['POST'])
def scan_library():
    """Scan music library"""
    if 'user_id' not in session:
        return jsonify({'error': 'Authentication required'}), 401
    
    music_config = {
        'music_paths': json.loads(config['music']['paths']),
        'supported_formats': json.loads(config['music']['formats']),
        'database_path': config['database']['path']
    }
    
    scanner = MusicScanner(music_config)
    stats = scanner.scan_library()
    
    return jsonify({
        'success': True,
        'stats': stats
    })

@app.route('/api/search', methods=['GET'])
def search():
    """Search for music"""
    if 'user_id' not in session:
        return jsonify({'error': 'Authentication required'}), 401
    
    query = request.args.get('q', '')
    limit = int(request.args.get('limit', 50))
    
    if not query:
        return jsonify({'results': []})
    
    results = db_manager.search_tracks(query, limit)
    
    return jsonify({
        'results': results
    })

@app.route('/api/albums', methods=['GET'])
def get_albums():
    """Get album list"""
    if 'user_id' not in session:
        return jsonify({'error': 'Authentication required'}), 401
    
    limit = int(request.args.get('limit', 50))
    offset = int(request.args.get('offset', 0))
    
    albums = db_manager.get_albums(limit, offset)
    
    return jsonify({
        'albums': albums
    })

@app.route('/api/albums/<int:album_id>/tracks', methods=['GET'])
def get_album_tracks(album_id):
    """Get tracks for an album"""
    if 'user_id' not in session:
        return jsonify({'error': 'Authentication required'}), 401
    
    tracks = db_manager.get_album_tracks(album_id)
    
    return jsonify({
        'tracks': tracks
    })

@app.route('/api/playlists', methods=['GET'])
def get_playlists():
    """Get user's playlists"""
    if 'user_id' not in session:
        return jsonify({'error': 'Authentication required'}), 401
    
    playlists = db_manager.get_playlists(session['user_id'])
    
    return jsonify({
        'playlists': playlists
    })

@app.route('/api/playlists', methods=['POST'])
def create_playlist():
    """Create a new playlist"""
    if 'user_id' not in session:
        return jsonify({'error': 'Authentication required'}), 401
    
    data = request.json
    name = data.get('name')
    
    if not name:
        return jsonify({'error': 'Playlist name is required'}), 400
    
    playlist_id = db_manager.create_playlist(session['user_id'], name)
    
    return jsonify({
        'success': True,
        'playlist_id': playlist_id
    })

@app.route('/api/playlists/<int:playlist_id>/tracks', methods=['GET'])
def get_playlist_tracks(playlist_id):
    """Get tracks in a playlist"""
    if 'user_id' not in session:
        return jsonify({'error': 'Authentication required'}), 401
    
    tracks = db_manager.get_playlist_tracks(playlist_id)
    
    return jsonify({
        'tracks': tracks
    })

@app.route('/api/playlists/<int:playlist_id>/tracks', methods=['POST'])
def add_track_to_playlist(playlist_id):
    """Add a track to a playlist"""
    if 'user_id' not in session:
        return jsonify({'error': 'Authentication required'}), 401
    
    data = request.json
    track_id = data.get('track_id')
    position = data.get('position')
    
    if not track_id:
        return jsonify({'error': 'Track ID is required'}), 400
    
    db_manager.add_track_to_playlist(playlist_id, track_id, position)
    
    return jsonify({
        'success': True
    })

@app.route('/api/favorites', methods=['GET'])
def get_favorites():
    """Get user's favorite tracks"""
    if 'user_id' not in session:
        return jsonify({'error': 'Authentication required'}), 401
    
    favorites = db_manager.get_favorites(session['user_id'])
    
    return jsonify({
        'favorites': favorites
    })

@app.route('/api/favorites/<int:track_id>', methods=['POST'])
def add_favorite(track_id):
    """Add a track to favorites"""
    if 'user_id' not in session:
        return jsonify({'error': 'Authentication required'}), 401
    
    db_manager.add_to_favorites(session['user_id'], track_id)
    
    return jsonify({
        'success': True
    })

@app.route('/api/favorites/<int:track_id>', methods=['DELETE'])
def remove_favorite(track_id):
    """Remove a track from favorites"""
    if 'user_id' not in session:
        return jsonify({'error': 'Authentication required'}), 401
    
    db_manager.remove_from_favorites(session['user_id'], track_id)
    
    return jsonify({
        'success': True
    })

@app.route('/api/tracks/<int:track_id>/play', methods=['POST'])
def record_play(track_id):
    """Record that a track was played"""
    if 'user_id' not in session:
        return jsonify({'error': 'Authentication required'}), 401
    
    db_manager.update_play_count(track_id)
    
    return jsonify({
        'success': True
    })

@app.route('/api/stats', methods=['GET'])
def get_stats():
    """Get library statistics"""
    if 'user_id' not in session:
        return jsonify({'error': 'Authentication required'}), 401
    
    stats = db_manager.get_stats()
    
    return jsonify({
        'stats': stats
    })

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=8085)