import * as path from 'path';
import type { ProjectProfile } from '../../features/projectChronicle';
import { slugify } from './textHelpers';

/**
 * Chronicle ProjectProfile 의 *자동 생성* factory 모음. sidebarProvider 가 옛
 * 코드 3 곳에서 살짝 다른 default 들로 inline 생성하던 패턴을 한 파일에 모아
 * (a) recordRoot 경로 규약 단일화, (b) description/corePurpose 기본 카피라이팅
 * 한 곳에서 수정, (c) 새 origin 추가 시 다른 두 factory 와 일관성 비교 용이.
 *
 *   - workspaceAutoDetectedProfile — ChronicleProjectStore.getAll() 의 빈 fallback
 *   - workspaceSynthesizedProfile  — _ensureActiveProjectForWorkspace case 3
 *   - architectureActivationStub   — _activateArchitectureForProject 가 store 에
 *                                    없는 projectId 로 호출됐을 때 즉석 stub
 *
 * 셋 다 stateless — vscode 같은 외부 API 의존 없음. workspace root 는 호출자가
 * 미리 해결해서 넘긴다.
 */

const NOW = (): string => new Date().toISOString();

/**
 * recordRoot 표준 위치: `<projectRoot>/docs/records/<projectName>/`. 3 factory 가
 * 공통으로 따르는 규약 — 별도 helper 로 빼서 정책 변경 시 한 줄 수정.
 */
function defaultRecordRoot(projectRoot: string, projectName: string): string {
    return path.join(projectRoot, 'docs', 'records', projectName);
}

/**
 * ChronicleProjectStore.getAll() 가 valid project 0 개일 때 즉석 만들어 반환하는
 * default. 사용자가 한 번도 chronicle project 를 등록 안 했어도 chronicle 기능이
 * 동작 가능하게. description/corePurpose 가 가장 풍부 — 진짜 "이게 default 야"
 * 라는 의도 전달.
 */
export function workspaceAutoDetectedProfile(workspaceRoot: string): ProjectProfile {
    const projectName = path.basename(workspaceRoot) || 'Current Project';
    const now = NOW();
    return {
        projectId: slugify(projectName),
        projectName,
        projectRoot: workspaceRoot,
        recordRoot: defaultRecordRoot(workspaceRoot, projectName),
        description: 'Auto-detected current workspace project.',
        corePurpose: 'Capture project planning, decisions, development notes, bugs, and retrospectives as Markdown.',
        targetUsers: ['Project developer'],
        avoidDirections: ['Do not tightly couple records to chat execution internals.'],
        detailLevel: 'standard',
        createdAt: now,
        updatedAt: now,
    };
}

/**
 * `_ensureActiveProjectForWorkspace` 가 case 3 (어떤 chronicle project 도
 * workspace 와 매칭 안 됨) 에서 만드는 새 entry. 명시 등록 직전이라 description
 * 만 가볍게, corePurpose 는 빈 문자열 (사용자가 나중에 채울 수 있게).
 */
export function workspaceSynthesizedProfile(workspaceRoot: string): ProjectProfile {
    const projectName = path.basename(workspaceRoot) || 'Current Project';
    const now = NOW();
    return {
        projectId: slugify(projectName),
        projectName,
        projectRoot: workspaceRoot,
        recordRoot: defaultRecordRoot(workspaceRoot, projectName),
        description: 'Auto-detected from workspace folder.',
        corePurpose: '',
        detailLevel: 'standard',
        createdAt: now,
        updatedAt: now,
    };
}

/**
 * `_activateArchitectureForProject` 가 호출됐는데 해당 projectId 가 store 에 없을
 * 때 만드는 stub. 사용자가 *path-only* 매칭으로 activate 한 케이스 — 이후 흐름이
 * 같은 profile 로 chronicle 기능을 쓸 수 있게 해야 함.
 */
export function architectureActivationStub(
    projectId: string,
    projectRoot: string,
    fallbackName?: string,
): ProjectProfile {
    const projectName = fallbackName || path.basename(projectRoot) || projectId;
    const now = NOW();
    return {
        projectId,
        projectName,
        projectRoot,
        recordRoot: defaultRecordRoot(projectRoot, projectName),
        description: 'Auto-created by Project Architecture activation.',
        corePurpose: '',
        detailLevel: 'standard',
        createdAt: now,
        updatedAt: now,
    };
}

/**
 * 경로 비교용 정규화 — trailing slash 제거 + lowercase. case-insensitive
 * 파일시스템 (macOS default, Windows) 에서 자기 자신끼리 비교가 안전.
 */
export function normalizePathForCompare(p: string | undefined): string {
    return (p || '').replace(/[\\/]+$/, '').toLowerCase();
}
