#!/usr/bin/env python3
"""Recount an archived own-brand study offline; no third-party dependencies."""
import argparse
from collections import Counter
import hashlib
import json
from pathlib import Path
import re


def recount(archive):
    answers = archive['answers']
    phrase = re.compile(r'\bshare\s+of\s+voice\b', re.IGNORECASE)
    providers = {}
    occurrences = 0
    unclassified = []
    for answer in answers:
        row = providers.setdefault(answer['platform'], Counter())
        row['collected'] += 1
        hits = len(phrase.findall(answer['text']))
        occurrences += hits
        row['literalPhraseAnswers'] += int(hits > 0)
        row['analyzed'] += int(answer['analyzed'])
        row['namedBySavedAnalysis'] += int(answer['brandNamedBySavedAnalysis'] is True)
        if not answer['analyzed']:
            unclassified.append(answer['id'])
    return {
        'collected': len(answers),
        'analyzed': sum(a['analyzed'] for a in answers),
        'literalPhraseAnswers': sum(p['literalPhraseAnswers'] for p in providers.values()),
        'literalPhraseOccurrences': occurrences,
        'namedBySavedAnalysis': sum(a['brandNamedBySavedAnalysis'] is True for a in answers),
        'domainTextAnswers': sum('shareofvoice.app' in a['text'].lower() for a in answers),
        'questionGroups': len(archive['questions']),
        'uniquePrompts': len({a['prompt'] for a in answers}),
        'unclassifiedAnswerIds': unclassified,
        'providers': providers,
    }


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument('archive', type=Path, help='Path to downloaded answers.json')
    args = parser.parse_args()
    try:
        raw = args.archive.read_bytes()
        result = recount(json.loads(raw))
    except (OSError, ValueError, KeyError, TypeError) as error:
        parser.error(str(error))
    result['datasetSha256'] = hashlib.sha256(raw).hexdigest()
    print(json.dumps(result, indent=2, ensure_ascii=False))


if __name__ == '__main__':
    main()
