from dataclasses import dataclass, field, asdict
from ldap3 import Server, Connection, ALL
import json
from pathlib import Path
import csv
from typing import Optional


@dataclass
class User:
    lastname: str
    firstname: str
    username: str
    password: str = field(repr=False)
    title: str
    admin: bool
    write: bool
    department: list
    costcenter: list


class Auth:
    def __init__(self) -> None:
        with open(Path(__file__).parent.parent.joinpath('config', 'users.csv'), 'r') as frh:
            csv_reader = csv.DictReader(frh, delimiter=';')
            self.users = dict([(row['username'].lower(), self.parse_users_csv(row)) for row in csv_reader])

    def parse_users_csv(self, row: dict) -> User:
        row['admin'] = (row['admin'] == 'True')
        row['write'] = (row['write'] == 'True')
        row['department'] = json.loads(row['department'])
        row['costcenter'] = json.loads(row['costcenter'])
        return User(**row)

    def get_user(self, username, password) -> Optional[dict]:
        username = username.lower()
        if username not in self.users:
            return None

        if self.users[username].password != password and not self.connect_ldap(username, password):
            return None

        res = asdict(self.users[username])
        del(res['password'])
        return res

    def connect_ldap(self, username, password) -> bool:
        server = Server('ahr.local:389', get_info=ALL, use_ssl=False, connect_timeout=5)
        user = username.lower() + '@ahr.local'
        conn = Connection(server, user=user, password=password)
        try:
            return bool(conn.bind())
        except Exception:
            return False


if __name__ == '__main__':
    print(Auth().get_user('TKP', 'G9zHjA__'))