import { RequestCluster } from '../../../request-cluster';
import { dataLocationToText, wordlist } from '../../../util';
import { ExplainerKey } from '../explainers';
import { v } from '../verbs';
import { Problem } from './problem';

export class UnknownPurposes extends Problem {
    getNecessaryExplainers(): ExplainerKey[] {
        const has_cookies = this.getAffectedClusters().some((cluster) => cluster.hasCookies());
        if (has_cookies) {
            return ['cookies_are_pii'];
        } else {
            return [];
        }
    }

    isHostAffected(host: string) {
        const answers = this.answers.hosts[host];
        if (!answers) {
            return false;
        }
        return (
            ['not_mentioned', 'not_before_making_a_choice'].includes(answers.present) &&
            ['no', 'not_sure'].includes(answers.was_processing_necessary) &&
            (this.clusters[host].hasCookies() || this.clusters[host].exposesOrigin())
        );
    }

    qualifies(): boolean {
        return Object.keys(this.answers.hosts).some((host) => this.isHostAffected(host));
    }

    getAffectedClusters(): RequestCluster[] {
        return Object.keys(this.answers.hosts)
            .filter((host) => this.isHostAffected(host))
            .map((host) => this.clusters[host]);
    }

    getEmailContent({ mode, tone }: { mode: 'email' | 'report'; tone: 'official' | 'polite' }) {
        const _ = (key: string) => v(key, this.answers.zaimek);
        const affected_clusters = this.getAffectedClusters();
        const has_history = affected_clusters.some((cluster) => cluster.exposesOrigin());
        const has_cookies = affected_clusters.some((cluster) => cluster.hasCookies());

        return (
            <>
                <h2>Cele przetwarzania danych</h2>
                <p>
                    Państwa strona{' '}
                    {mode == 'email'
                        ? `ujawniła dane ${_('mnie')} dotyczące`
                        : 'ujawnia dane dotyczące użytkowników'}{' '}
                    w zakresie{' '}
                    {wordlist([
                        ...(has_cookies ? ['treści plików cookies'] : []),
                        ...(has_history
                            ? [
                                  mode === 'email'
                                      ? `części ${_('mojej')} historii przeglądania`
                                      : `części historii przeglądania`,
                              ]
                            : []),
                    ])}{' '}
                    podmiotom, które są właścicielami nastepujących domen:
                </p>
                <ul>
                    {affected_clusters.map((cluster, index) => {
                        const locations = cluster.exposesOriginWhere();
                        return (
                            <li>
                                <strong>{cluster.id}</strong>:{' '}
                                {wordlist([
                                    ...(cluster.hasCookies() ? ['treść plików cookies'] : []),
                                    ...(cluster.exposesOrigin()
                                        ? [
                                              (mode === 'email'
                                                  ? `część ${_('mojej')} historii przeglądania`
                                                  : `część historii przeglądania użytkownika`) +
                                                  ' (' +
                                                  wordlist(
                                                      locations.map((l) => dataLocationToText(l))
                                                  ) +
                                                  ')',
                                          ]
                                        : []),
                                ])}
                                {index === affected_clusters.length - 1 ? '.' : ';'}
                            </li>
                        );
                    })}
                </ul>
                {mode === 'email' ? (
                    tone === 'official' ? (
                        <p>
                            Proszę o wskazanie, jakie są cele takiego przetwarzania danych, które
                            mnie dotyczą.
                        </p>
                    ) : (
                        <p>
                            Apeluję o umieszczenie informacji na temat na Państwa stronie, aby jej
                            użytkownicy mogli podejmować w pełni świadome wybory dotyczące
                            przetwarzania danych ich dotyczących.
                        </p>
                    )
                ) : (
                    <p>
                        <strong>Zalecenie</strong>: warto dodać informacje o tym, jakie są cele
                        ujawniania wyżej opisanych danych wyżej opisanym podmiotom trzecim.
                    </p>
                )}
            </>
        );
    }
}
