#!/usr/bin/env bash
set -e

PROJECT="adminlte-admin"
SESS="/Users/rbutare/websites/system/tmp/sessions"

echo "Installing $PROJECT ..."

mkdir -p "$PROJECT"
cd "$PROJECT"

echo "Creating directory structure..."
mkdir -p public lib api pages "$SESS"

chmod 700 "$SESS"

############################################
# Core.php
############################################
cat > lib/Core.php <<EOF
<?php
ini_set('session.save_path', '$SESS');
session_start();

define('DB_HOST','localhost');
define('DB_NAME','adminlte_admin');
define('DB_USER','root');
define('DB_PASS','root');

require __DIR__.'/DB.php';
require __DIR__.'/Auth.php';
EOF

############################################
# DB.php
############################################
cat > lib/DB.php <<'EOF'
<?php
class DB {
    private static ?PDO $pdo = null;

    public static function conn(): PDO {
        if (!self::$pdo) {
            $dsn = "mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=utf8mb4";
            self::$pdo = new PDO($dsn, DB_USER, DB_PASS, [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
            ]);
        }
        return self::$pdo;
    }

    public static function fetchUserByEmail(string $email): ?array {
        $stmt = self::conn()->prepare("
            SELECT id, username, email, password_hash, is_active, is_admin, role
            FROM users
            WHERE email = :email
            LIMIT 1
        ");
        $stmt->execute(['email'=>$email]);
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        return $row ?: null;
    }
}
EOF

############################################
# Auth.php
############################################
cat > lib/Auth.php <<'EOF'
<?php
class Auth {

    public static function login(string $email, string $password): bool {
        $u = DB::fetchUserByEmail($email);

        if (!$u) return false;
        if ((int)$u['is_active'] !== 1) return false;
        if (!password_verify($password, $u['password_hash'])) return false;

        $_SESSION['user_id']  = $u['id'];
        $_SESSION['username'] = $u['username'];
        $_SESSION['email']    = $u['email'];
        $_SESSION['role']     = $u['role'];
        $_SESSION['is_admin'] = $u['is_admin'];

        return true;
    }

    public static function logout(): void {
        $_SESSION = [];
        session_destroy();
    }

    public static function check(): bool {
        return isset($_SESSION['user_id']);
    }

    public static function requireLogin(): void {
        if (!self::check()) {
            header("Location: login.php");
            exit;
        }
    }
}
EOF

############################################
# PAGE-top.php
############################################
cat > lib/PAGE-top.php <<'EOF'
<?php require __DIR__.'/Core.php'; Auth::requireLogin(); ?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>AdminLTE Admin</title>

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/admin-lte@3.2/dist/css/adminlte.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css">

</head>
<body class="hold-transition sidebar-mini">
<div class="wrapper">

<nav class="main-header navbar navbar-expand navbar-white navbar-light">
<ul class="navbar-nav">
<li class="nav-item"><a href="index.php" class="nav-link">Dashboard</a></li>
<li class="nav-item"><a href="pages/manage.users.php" class="nav-link">User Manager</a></li>
<li class="nav-item"><a href="pages/add.user.php" class="nav-link">Add User</a></li>
</ul>

<ul class="navbar-nav ms-auto">
<li class="nav-item"><span class="nav-link"><?=htmlspecialchars($_SESSION['username'])?></span></li>
<li class="nav-item"><a href="logout.php" class="nav-link text-danger">Logout</a></li>
</ul>
</nav>

<aside class="main-sidebar sidebar-dark-primary elevation-4">
<a href="index.php" class="brand-link"><span class="brand-text">AdminLTE Admin</span></a>
<div class="sidebar">
<nav class="mt-2"><ul class="nav nav-pills nav-sidebar flex-column">
<li class="nav-item"><a href="index.php" class="nav-link"><i class="nav-icon fas fa-home"></i><p>Dashboard</p></a></li>
<li class="nav-item"><a href="pages/manage.users.php" class="nav-link"><i class="nav-icon fas fa-users"></i><p>User Manager</p></a></li>
<li class="nav-item"><a href="pages/add.user.php" class="nav-link"><i class="nav-icon fas fa-user-plus"></i><p>Add User</p></a></li>
</ul></nav>
</div>
</aside>

<div class="content-wrapper">
<section class="content">
<div class="container-fluid">
EOF

############################################
# PAGE-bottom.php
############################################
cat > lib/PAGE-bottom.php <<'EOF'
</div></section></div>

<footer class="main-footer">
<strong>&copy; <?=date('Y')?> AdminLTE Admin</strong>
</footer>

</div>

<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/admin-lte@3.2/dist/js/adminlte.min.js"></script>

<script src="public/admin.js"></script>
</body>
</html>
EOF

############################################
# admin.js
############################################
cat > public/admin.js <<'EOF'
console.log("AdminLTE Admin Loaded");
EOF

############################################
# login.php
############################################
cat > login.php <<'EOF'
<?php require __DIR__.'/lib/Core.php';

if (Auth::check()) {
    header("Location: index.php");
    exit;
}

$error = null;

if ($_SERVER['REQUEST_METHOD']==='POST') {
    if (Auth::login($_POST['email'], $_POST['password'])) {
        header("Location: index.php");
        exit;
    }
    $error = "Invalid login.";
}
?>
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/admin-lte@3.2/dist/css/adminlte.min.css">
</head>
<body class="hold-transition login-page">
<div class="login-box"><div class="card card-outline card-primary">
<div class="card-header text-center"><b>AdminLTE</b> Admin</div>
<div class="card-body">
<?php if($error): ?><div class="alert alert-danger"><?=$error?></div><?php endif; ?>
<form method="post">
<input type="email" name="email" class="form-control mb-3" placeholder="Email" required>
<input type="password" name="password" class="form-control mb-3" placeholder="Password" required>
<button class="btn btn-primary btn-block">Sign In</button>
</form>
</div></div></div>
</body></html>
EOF

############################################
# logout.php
############################################
cat > logout.php <<'EOF'
<?php require __DIR__.'/lib/Core.php'; Auth::logout(); header("Location: login.php");
EOF

############################################
# index.php
############################################
cat > index.php <<'EOF'
<?php require __DIR__.'/lib/PAGE-top.php'; ?>
<div class="row">
<div class="col-lg-3 col-6"><div class="small-box bg-info">
<div class="inner"><h3>Admin</h3><p>Welcome</p></div>
<div class="icon"><i class="fas fa-user-shield"></i></div></div></div>
</div>
<?php require __DIR__.'/lib/PAGE-bottom.php'; ?>
EOF

############################################
# User Manager Pages
############################################

# manage.users.php
cat > pages/manage.users.php <<'EOF'
<?php require __DIR__.'/../lib/PAGE-top.php';

$users = DB::conn()->query("
    SELECT id, username, email, role, is_active, is_admin, created_at
    FROM users ORDER BY id ASC
")->fetchAll(PDO::FETCH_ASSOC);
?>

<div class="card">
<div class="card-header"><h3 class="card-title">User Manager</h3></div>
<div class="card-body">
<table class="table table-bordered table-striped">
<thead><tr>
<th>ID</th><th>Username</th><th>Email</th><th>Role</th>
<th>Active</th><th>Admin</th><th>Created</th><th>Actions</th>
</tr></thead>
<tbody>
<?php foreach($users as $u): ?>
<tr>
<td><?=$u['id']?></td>
<td><?=htmlspecialchars($u['username'])?></td>
<td><?=htmlspecialchars($u['email'])?></td>
<td><?=$u['role']?></td>
<td><?=$u['is_active']?'Yes':'No'?></td>
<td><?=$u['is_admin']?'Yes':'No'?></td>
<td><?=$u['created_at']?></td>
<td>
<a href="edit.user.php?id=<?=$u['id']?>" class="btn btn-sm btn-primary">Edit</a>
<a href="chg.php?email=<?=urlencode($u['email'])?>" class="btn btn-sm btn-warning">Password</a>
<a href="delete.user.php?id=<?=$u['id']?>" class="btn btn-sm btn-danger"
onclick="return confirm('Delete user?');">Delete</a>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div></div>

<?php require __DIR__.'/../lib/PAGE-bottom.php'; ?>
EOF

# add.user.php
cat > pages/add.user.php <<'EOF'
<?php require __DIR__.'/../lib/PAGE-top.php';

$success=null; $error=null;

if ($_SERVER['REQUEST_METHOD']==='POST') {
    $username=trim($_POST['username']);
    $email=trim($_POST['email']);
    $password=trim($_POST['password']);
    $role=trim($_POST['role']);
    $comment=trim($_POST['comment']);

    if ($username=='' || $email=='' || $password=='') {
        $error="Required fields missing.";
    } else {
        $hash=password_hash($password,PASSWORD_DEFAULT);

        $stmt=DB::conn()->prepare("
            INSERT INTO users
            (username,email,password_hash,is_active,role,comment,is_admin)
            VALUES (:u,:e,:h,1,:r,:c,0)
        ");

        try {
            $stmt->execute([
                'u'=>$username,'e'=>$email,'h'=>$hash,
                'r'=>$role,'c'=>$comment
            ]);
            $success="User created.";
        } catch(PDOException $ex) {
            $error=$ex->getMessage();
        }
    }
}
?>

<div class="card"><div class="card-header"><h3 class="card-title">Add User</h3></div>
<div class="card-body">
<?php if($success): ?><div class="alert alert-success"><?=$success?></div><?php endif; ?>
<?php if($error): ?><div class="alert alert-danger"><?=$error?></div><?php endif; ?>

<form method="post">
<input type="text" name="username" class="form-control mb-3" placeholder="Username" required>
<input type="email" name="email" class="form-control mb-3" placeholder="Email" required>
<input type="password" name="password" class="form-control mb-3" placeholder="Password" required>
<input type="text" name="role" class="form-control mb-3" value="user">
<input type="text" name="comment" class="form-control mb-3" placeholder="Comment">
<button class="btn btn-primary">Create User</button>
</form>
</div></div>

<?php require __DIR__.'/../lib/PAGE-bottom.php'; ?>
EOF

# edit.user.php
cat > pages/edit.user.php <<'EOF'
<?php require __DIR__.'/../lib/PAGE-top.php';

$id=intval($_GET['id']);
$stmt=DB::conn()->prepare("SELECT * FROM users WHERE id=:id");
$stmt->execute(['id'=>$id]);
$user=$stmt->fetch(PDO::FETCH_ASSOC);

if(!$user){ echo "<div class='alert alert-danger'>User not found.</div>"; require __DIR__.'/../lib/PAGE-bottom.php'; exit; }

$success=null;

if($_SERVER['REQUEST_METHOD']==='POST'){
    $username=trim($_POST['username']);
    $email=trim($_POST['email']);
    $role=trim($_POST['role']);
    $is_active=intval($_POST['is_active']);
    $is_admin=intval($_POST['is_admin']);
    $comment=trim($_POST['comment']);

    $stmt=DB::conn()->prepare("
        UPDATE users SET
        username=:u,email=:e,role=:r,is_active=:a,is_admin=:i,comment=:c
        WHERE id=:id
    ");
    $stmt->execute([
        'u'=>$username,'e'=>$email,'r'=>$role,
        'a'=>$is_active,'i'=>$is_admin,'c'=>$comment,'id'=>$id
    ]);

    $success="User updated.";
}
?>

<div class="card"><div class="card-header"><h3 class="card-title">Edit User</h3></div>
<div class="card-body">
<?php if($success): ?><div class="alert alert-success"><?=$success?></div><?php endif; ?>

<form method="post">
<input type="text" name="username" class="form-control mb-3"
value="<?=htmlspecialchars($user['username'])?>" required>

<input type="email" name="email" class="form-control mb-3"
value="<?=htmlspecialchars($user['email'])?>" required>

<input type="text" name="role" class="form-control mb-3"
value="<?=htmlspecialchars($user['role'])?>">

<select name="is_active" class="form-control mb-3">
<option value="1" <?=$user['is_active']?'selected':''?>>Active</option>
<option value="0" <?=!$user['is_active']?'selected':''?>>Inactive</option>
</select>

<select name="is_admin" class="form-control mb-3">
<option value="1" <?=$user['is_admin']?'selected':''?>>Admin</option>
<option value="0" <?=!$user['is_admin']?'selected':''?>>User</option>
</select>

<input type="text" name="comment" class="form-control mb-3"
value="<?=htmlspecialchars($user['comment'])?>">

<button class="btn btn-primary">Save</button>
</form>
</div></div>

<?php require __DIR__.'/../lib/PAGE-bottom.php'; ?>
EOF

# delete.user.php
cat > pages/delete.user.php <<'EOF'
<?php require __DIR__.'/../lib/PAGE-top.php';

$id=intval($_GET['id']);
$stmt=DB::conn()->prepare("DELETE FROM users WHERE id=:id");
$stmt->execute(['id'=>$id]);

echo "<div class='alert alert-success'>User deleted.</div>";
echo "<a href='manage.users.php' class='btn btn-primary'>Back</a>";

require __DIR__.'/../lib/PAGE-bottom.php';
EOF

# chg.php
cat > pages/chg.php <<'EOF'
<?php require __DIR__.'/../lib/PAGE-top.php';

$email_prefill=$_GET['email']??'';
$success=null; $error=null;

if($_SERVER['REQUEST_METHOD']==='POST'){
    $email=trim($_POST['email']);
    $newpass=trim($_POST['newpass']);

    if($email==''||$newpass==''){
        $error="Missing fields.";
    } else {
        $user=DB::fetchUserByEmail($email);
        if(!$user){
            $error="User not found.";
        } else {
            $hash=password_hash($newpass,PASSWORD_DEFAULT);
            $stmt=DB::conn()->prepare("
                UPDATE users SET password_hash=:h WHERE email=:e
            ");
            $stmt->execute(['h'=>$hash,'e'=>$email]);
            $success="Password updated.";
        }
    }
}
?>

<div class="card"><div class="card-header"><h3 class="card-title">Change Password</h3></div>
<div class="card-body">
<?php if($success): ?><div class="alert alert-success"><?=$success?></div><?php endif; ?>
<?php if($error): ?><div class="alert alert-danger"><?=$error?></div><?php endif; ?>

<form method="post">
<input type="email" name="email" class="form-control mb-3"
value="<?=htmlspecialchars($email_prefill)?>" required>

<input type="password" name="newpass" class="form-control mb-3" required>

<button class="btn btn-warning">Change Password</button>
</form>
</div></div>

<?php require __DIR__.'/../lib/PAGE-bottom.php'; ?>
EOF

############################################
# SQL Schema + Seed Admin User
############################################
cat > SQL.sql <<EOF
CREATE TABLE users (
 id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
 username VARCHAR(50) NOT NULL UNIQUE,
 email VARCHAR(255) NOT NULL UNIQUE,
 password_hash VARCHAR(255) NOT NULL,
 is_active TINYINT(1) NOT NULL DEFAULT 1,
 created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
 updated_at TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
 role VARCHAR(50) NOT NULL DEFAULT 'user',
 comment VARCHAR(255) NULL,
 reset_token_hash VARCHAR(64) NULL,
 reset_expires_at DATETIME NULL,
 is_admin TINYINT(1) NOT NULL DEFAULT 0
);

INSERT INTO users
(username,email,password_hash,is_active,role,is_admin)
VALUES
(
 'admin',
 'admin@example.com',
 '$(php -r "echo password_hash('admin123', PASSWORD_DEFAULT);")',
 1,
 'admin',
 1
);
EOF

echo "Admin package installed in $PROJECT/"

