const fs = require('fs');
const path = require('path');

const root = __dirname;
const read = (file) => fs.readFileSync(path.join(root, file), 'utf8');
const files = {
  dashboard: read('dashboard.php'),
  ticket: read('ticket_view.php'),
  header: read('app/header.php'),
  css: read('assets/css/style.css'),
  js: read('assets/js/app.js'),
  users: read('users.php'),
};

let passed = 0;
let failed = 0;
function check(label, condition) {
  if (condition) {
    passed++;
    console.log(`PASS | ${label}`);
  } else {
    failed++;
    console.log(`FAIL | ${label}`);
  }
}

check('Dashboard: Najnoviji zahtevi imaju lokalnu klasu za hover', files.dashboard.includes('class="card card-pad recent-tickets-card"'));
check('Dashboard: Dodeljena oprema zadržava postojeću dashboard-two-col strukturu', files.dashboard.includes('<section class="dashboard-two-col">'));
check('Dashboard: razmak koristi postojeću 18px skalu', /\.dashboard-two-col\s*\{[^}]*margin-bottom:\s*18px/s.test(files.css));
check('Dashboard: hover je diskretan i bez layout reflow-a', /\.recent-tickets-card:hover\s*\{[^}]*transform:\s*translateY\(-1px\)/s.test(files.css));
check('Dashboard: hover koristi postojeće border/shadow varijable', /\.recent-tickets-card:hover\s*\{[^}]*border-color:\s*var\(--border-strong\)[^}]*box-shadow:\s*var\(--shadow-soft\)/s.test(files.css));
check('Dashboard: tabela Najnoviji zahtevi ima lokalni horizontalni overflow i na tablet širini', /\.recent-tickets-card \.table-wrap\s*\{[^}]*overflow-x:\s*auto/s.test(files.css));

check('Evidencija: događaji ostaju sortirani najnoviji-prvi', files.ticket.includes("ORDER BY e.created_at DESC, e.id DESC"));
check('Evidencija: uklonjen je LIMIT 20', !files.ticket.includes("ORDER BY e.created_at DESC, e.id DESC LIMIT 20"));
check('Evidencija: lokalni scroll se primenjuje samo na tiket timeline', files.ticket.includes('class="timeline ticket-events-timeline"'));
check('Evidencija: scroll kontejner je fokusabilan za tastaturu', files.ticket.includes('tabindex="0" aria-label="Poslednji događaji"'));
check('Evidencija: visina je ograničena na približno šest stavki', /\.ticket-events-timeline\s*\{[^}]*max-height:\s*518px/s.test(files.css));
check('Evidencija: koristi interni vertikalni scroll', /\.ticket-events-timeline\s*\{[^}]*overflow-y:\s*auto/s.test(files.css));
check('Evidencija: mobilni viewport dodatno ograničava visinu', /@media \(max-width:\s*760px\)[\s\S]*?\.ticket-events-timeline\s*\{[^}]*60dvh/s.test(files.css));
check('Evidencija: zajednički timeline na users.php nije promenjen u scroll komponentu', !files.users.includes('ticket-events-timeline'));

check('Profil: vidljivost statistike koristi postojeći admin/additional-role model', files.header.includes('$showActiveTicketStat = $user !== null && (is_system_admin($user) || user_has_additional_role($user));'));
check('Profil: COUNT upit je uslovljen vidljivošću statistike', /if \(\$showActiveTicketStat\) \{[\s\S]*?SELECT COUNT\(\*\) FROM tickets/s.test(files.header));
check('Profil: Aktivni zahtevi se renderuju samo uslovno', /<\?php if \(\$showActiveTicketStat\): \?>[\s\S]*?<span>Aktivni zahtevi<\/span>[\s\S]*?<\?php endif; \?>/s.test(files.header));
check('Profil: osnovne stavke običnog korisnika ostaju prisutne', ['Moj panel','Novi zahtev','Moji tiketi','Obaveštenja','Podaci o nalogu','Odjava'].every(v => files.header.includes(v)));
check('Profil: dodatne role i admin linkovi nisu uklonjeni', files.header.includes('user_has_additional_role($user)') && files.header.includes('is_system_admin($user)'));

check('Asset cache verzija je 3.25.0', (files.header.match(/\?v=3\.25\.0/g) || []).length >= 2);
check('Nije uveden JavaScript workaround za hover/scroll', !files.js.includes('recent-tickets-card') && !files.js.includes('ticket-events-timeline'));
check('Evidencija: kartica ima lokalnu klasu za desktop poravnanje', files.ticket.includes('class="card ticket-evidence-card"'));
check('Evidencija: desktop ticket layout koristi stretch bez fiksne visine spoljne kartice', /@media \(min-width:\s*1161px\)[\s\S]*?\.ticket-layout\s*\{[^}]*align-items:\s*stretch/s.test(files.css) && !/\.ticket-layout > \.side-stack > \.ticket-evidence-card\s*\{[^}]*?(?:^|[;{]\s*)height:\s*\d+px/ms.test(files.css));
check('Evidencija: desktop sidebar može da se uklopi u visinu glavne kartice', /\.ticket-layout > \.side-stack\s*\{[^}]*display:\s*flex[^}]*flex-direction:\s*column[^}]*min-height:\s*0/s.test(files.css));
check('Evidencija: desktop timeline koristi sav prostor i interni scroll', /\.ticket-evidence-card \.ticket-events-timeline\s*\{[^}]*flex:\s*1 1 0[^}]*min-height:\s*0[^}]*max-height:\s*none[^}]*overflow-y:\s*auto[^}]*align-content:\s*start/s.test(files.css));


const opens = (files.css.match(/\{/g) || []).length;
const closes = (files.css.match(/\}/g) || []).length;
check('CSS vitičaste zagrade su izbalansirane', opens === closes);

console.log(`\nRezultat: ${passed}/${passed + failed} provera uspešno.`);
process.exit(failed === 0 ? 0 : 1);
