const express = require('express');
const session = require('express-session');
const router = require('express').Router();
const path = require('path');

require('dotenv').config({path:'process.env'});

const app = express();
const mysql = require('mysql');

// Datenbankverbindung
const db = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'webshop'
});

// Verbindung zur MySQL-Datenbank herstellen
db.connect(err => {
    if (err) {
        console.error('Fehler beim Verbinden zur Datenbank:', err);
        return;
    }
    console.log('Mit der Datenbank verbunden');
});

app.use(session({
    secret: 'secret',
    resave: true,
    saveUninitialized: true
}));

app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(express.static(path.join(__dirname, '/scripts')));
app.use(express.static(path.join(__dirname, '/static')));

// API-Route für Produkte
app.get('/api/products', (req, res) => {
    // SQL-Abfrage für Produktdaten
    const sql = 'SELECT * FROM webshop.product';

    // Abfrage ausführen
    db.query(sql, (err, results) => {
        if (err) {
            console.error('Fehler beim Abrufen der Produkte:', err);
            res.status(500).send('Fehler beim Abrufen der Produkte');
            return;
        }
        res.json(results);  // Rückgabe der Produktdaten als JSON
    });
});

app.get('/api/products/new', async (req, res) => {
    // SQL-Abfrage für Produktdaten
    const sql = 'SELECT * FROM webshop.product ORDER BY created_at DESC LIMIT 4';

    // Abfrage ausführen
    db.query(sql, (err, results) => {
        if (err) {
            console.error('Fehler beim Abrufen der Produkte:', err);
            res.status(500).send('Fehler beim Abrufen der Produkte');
            return;
        }
        res.json(results);  // Rückgabe der Produktdaten als JSON
    });
});

app.get('/api/products/motorrad', async (req, res) => {
    // SQL-Abfrage für Produktdaten
    const sql = 'SELECT * FROM webshop.product WHERE category_id = 4';

    // Abfrage ausführen
    db.query(sql, (err, results) => {
        if (err) {
            console.error('Fehler beim Abrufen der Produkte:', err);
            res.status(500).send('Fehler beim Abrufen der Produkte');
            return;
        }
        res.json(results);  // Rückgabe der Produktdaten als JSON
    });
});

app.get('/api/products/oldtimer', async (req, res) => {
    // SQL-Abfrage für Produktdaten
    const sql = 'SELECT * FROM webshop.product WHERE category_id = 2';

    // Abfrage ausführen
    db.query(sql, (err, results) => {
        if (err) {
            console.error('Fehler beim Abrufen der Produkte:', err);
            res.status(500).send('Fehler beim Abrufen der Produkte');
            return;
        }
        res.json(results);  // Rückgabe der Produktdaten als JSON
    });
});

app.get('/api/products/lkw', async (req, res) => {
    // SQL-Abfrage für Produktdaten
    const sql = 'SELECT * FROM webshop.product WHERE category_id = 3';

    // Abfrage ausführen
    db.query(sql, (err, results) => {
        if (err) {
            console.error('Fehler beim Abrufen der Produkte:', err);
            res.status(500).send('Fehler beim Abrufen der Produkte');
            return;
        }
        res.json(results);  // Rückgabe der Produktdaten als JSON
    });
});

app.get('/api/products/sportwagen', async (req, res) => {
    // SQL-Abfrage für Produktdaten
    const sql = 'SELECT * FROM webshop.product WHERE category_id = 1';

    // Abfrage ausführen
    db.query(sql, (err, results) => {
        if (err) {
            console.error('Fehler beim Abrufen der Produkte:', err);
            res.status(500).send('Fehler beim Abrufen der Produkte');
            return;
        }
        res.json(results);  // Rückgabe der Produktdaten als JSON
    });
});

app.post('/api/user/registration', (req,res)=> {
    // SQL-Query für Nutzerregistration
    const {name, lower_name, email, passwd} = req.body;
    const sql = "INSERT INTO user (name, lower_name, email, passwd, passwd_hash_algo) VALUES (?, ?, ?, ?, 'none')"

    // Query abschicken
    db.query(sql, [name, lower_name, email, passwd], (err, results) => {
        if (err){
            console.error('Fehler beim Schreiben in die Datenbank: ', err);
            res.status(500).send('Fehler beim Schreiben in die Datenbank');
            return;
        }
        res.status(201).json({message: 'Nutzer erfolgreich hinzugefügt', id: results.insertId})
    })
})

const getIndexRoute = require('./scripts/routes/other/route-index');
app.use('/', getIndexRoute);

app.use((req, res) => {
    res.status(404).sendFile(path.join(__dirname, 'public', '404.html'));
});

// Sever starten
app.listen(process.env.APP_PORT, () => {
    console.log("\x1b[32m");
    console.log(`Server is running on http://localhost:${process.env.APP_PORT}`);
    console.log("\x1b[0m");
    console.log('Access it now...');
});