from flask import Flask, render_template, request, redirect, url_for, send_file, flash
import sqlite3
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
import io
from datetime import datetime

app = Flask(__name__)
app.secret_key = 'your_secret_key'  # Needed for flashing messages

def init_db():
    conn = sqlite3.connect('pycash.db')
    c = conn.cursor()
    c.execute('''
        CREATE TABLE IF NOT EXISTS transactions (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            type TEXT,
            amount REAL,
            recipient TEXT,
            date TEXT,
            memo TEXT
        )
    ''')
    c.execute('''
        CREATE TABLE IF NOT EXISTS balance (
            id INTEGER PRIMARY KEY,
            total REAL
        )
    ''')
    c.execute('SELECT COUNT(*) FROM balance')
    if c.fetchone()[0] == 0:
        c.execute('INSERT INTO balance (id, total) VALUES (1, 0)')
    conn.commit()
    conn.close()

init_db()

def update_balance(amount, operation):
    conn = sqlite3.connect('pycash.db')
    c = conn.cursor()
    c.execute('SELECT total FROM balance WHERE id = 1')
    current_balance = c.fetchone()[0]
    new_balance = current_balance + amount if operation == 'deposit' else current_balance - amount
    c.execute('UPDATE balance SET total = ? WHERE id = 1', (new_balance,))
    conn.commit()
    conn.close()

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/add_payment', methods=['GET', 'POST'])
def add_payment():
    if request.method == 'POST':
        amount = float(request.form['dollars'])
        payment_to = request.form['paymentTo']
        date = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        memo = request.form.get('memo', '')

        conn = sqlite3.connect('pycash.db')
        c = conn.cursor()
        c.execute('SELECT total FROM balance WHERE id = 1')
        current_balance = c.fetchone()[0]

        if amount > current_balance:
            flash('Insufficient funds!')
            return redirect(url_for('add_payment'))
        
        c.execute('''
            INSERT INTO transactions (type, amount, recipient, date, memo)
            VALUES (?, ?, ?, ?, ?)
        ''', ('Payment', amount, payment_to, date, memo))
        conn.commit()
        conn.close()

        update_balance(amount, 'payment')

        return redirect(url_for('index'))
    return render_template('add_payment.html')

@app.route('/add_deposit', methods=['GET', 'POST'])
def add_deposit():
    if request.method == 'POST':
        amount = float(request.form['dollars'])
        date = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        memo = request.form.get('memo', '')

        conn = sqlite3.connect('pycash.db')
        c = conn.cursor()
        c.execute('''
            INSERT INTO transactions (type, amount, recipient, date, memo)
            VALUES (?, ?, ?, ?, ?)
        ''', ('Deposit', amount, '', date, memo))
        conn.commit()
        conn.close()

        update_balance(amount, 'deposit')

        return redirect(url_for('index'))
    return render_template('add_deposit.html')

@app.route('/view_finances', methods=['GET'])
def view_finances():
    conn = sqlite3.connect('pycash.db')
    c = conn.cursor()
    c.execute('SELECT * FROM transactions')
    transactions = c.fetchall()
    c.execute('SELECT total FROM balance WHERE id = 1')
    balance = c.fetchone()[0]
    conn.close()
    return render_template('view_finances.html', transactions=transactions, balance=balance)

@app.route('/generate_pdf')
def generate_pdf():
    conn = sqlite3.connect('pycash.db')
    c = conn.cursor()
    c.execute('SELECT * FROM transactions')
    transactions = c.fetchall()
    c.execute('SELECT total FROM balance WHERE id = 1')
    balance = c.fetchone()[0]
    conn.close()

    pdf_buffer = io.BytesIO()
    pdf = canvas.Canvas(pdf_buffer, pagesize=letter)
    width, height = letter

    pdf.setFont("Helvetica-Bold", 16)
    pdf.drawString(30, height - 30, "Transaction Statement")

    pdf.setFont("Helvetica-Bold", 12)
    pdf.drawString(30, height - 60, "Type")
    pdf.drawString(120, height - 60, "Amount")
    pdf.drawString(210, height - 60, "Date")
    pdf.drawString(300, height - 60, "From")

    y = height - 80
    pdf.setFont("Helvetica", 12)
    for transaction in transactions:
        transaction_type, amount, recipient, date, memo = transaction[1], transaction[2], transaction[3], transaction[4], transaction[5]
        pdf.drawString(30, y, transaction_type)
        pdf.drawString(120, y, f"₹{amount:.2f}")
        pdf.drawString(210, y, date)
        pdf.drawString(300, y, From)
        y -= 20

    pdf.setFont("Helvetica-Bold", 14)
    pdf.drawString(30, y - 20, f"Current Balance: ₹{balance:.2f}")

    pdf.save()
    pdf_buffer.seek(0)

    return send_file(pdf_buffer, as_attachment=True, download_name='statement.pdf', mimetype='application/pdf')

@app.route('/clear_transactions', methods=['POST'])
def clear_transactions():
    conn = sqlite3.connect('pycash.db')
    c = conn.cursor()
    c.execute('DELETE FROM transactions')
    c.execute('UPDATE balance SET total = 0 WHERE id = 1')
    conn.commit()
    conn.close()
    return redirect(url_for('index'))

if __name__ == '__main__':
    app.run(debug=True)